Lua - 使用多个双引号的popen命令

问题描述:

我正在编写一个Lua脚本来管理Windows上的Virtualbox。Lua - 使用多个双引号的popen命令

看来,多个双引号不能正确解析。我使用下面的函数来实现这一点:

--Get output from an OS command - http://stackoverflow.com/questions/132397/get-back-the-output-of-os-execute-in-lua 
function os.capture(cmd, raw) 
    local f = assert(io.popen(cmd, 'r')) 
    local s = assert(f:read('*a')) 
    f:close() 
    if raw then return s end 
    s = string.gsub(s, '^%s+', '') 
    s = string.gsub(s, '%s+$', '') 
    s = string.gsub(s, '[\n\r]+', ' ') 
    return s 
end 

此代码的工作这么长时间的机器名不具有空间,但机器可以有空格,所以我要支持他们:

local command = '"\\Program Files\\Oracle\\VirtualBox\\VBoxManage\" showvminfo '..key 

下面的代码不会在所有的工作,但它确实给命令的正确格式的日志文件,以便语法应该是正确的:

local command = '"\\Program Files\\Oracle\\VirtualBox\\VBoxManage\" showvminfo "'..key..'"' 
logger:write("[",os.date("%Y-%m-%d %H:%M:%S"),"] Command: ",command,"\n") 
vmStateRaw = os.capture(command, "raw") 

Log file entry: 
[2014-12-06 16:09:18] Command: "\Program Files\Oracle\VirtualBox\VBoxManage" showvminfo "Cerium" 

Interpreter output: 
'\Program' is not recognized as an internal or external command, 
operable program or batch file. 

我发现下面的语法著作:

 local command = '""\\Program Files\\Oracle\\VirtualBox\\VBoxManage\" showvminfo "'..key..'"' 

Log file output: 
[2014-12-06 16:27:54] Command: ""\Program Files\Oracle\VirtualBox\VBoxManage" showvminfo "Cerium" 

所以这个问题不解决的一个问题,因为我已经已位于做到这一点。我想了解为什么最后的命令有效,因为我目前的理解意味着这不应该起作用。

TIA

问题与如何system在C工作要做。在Windows下,system内部调用

CMD/Cyourinput

由于os.execute仅委派给systemsee here),您的命令可能最终成为执行:

cmd /c "\Program Files\Oracle\VirtualBox\VBoxManage" showvminfo "Cerium" 

仅供参考,从help cmd

如果/ C或/指定K,然后 后的命令行的其余部分的开关被处理作为一个命令行,其中,以下逻辑 用于处理引号(“)字符:

  1. 如果以下所有条件都满足,然后引号字符 在命令行上被保留:

    • 没有/ S切换
    • 恰好两个引号字符
    • 两个引号字符之间没有特殊字符, 其中特殊为以下之一:& <>()@^|
    • 还有的 两个引号字符
    • 在两个引号字符之间的串之间的一个或多个空格字符是一个可执行文件的名称 。
  2. 否则,老办法是,看第一个字符是 一个引号字符,如果是,舍去开头的字符并 删除最后一个引号字符在命令行上,在最后保留 任何文本报价字符。

由于您的命令中包含有4个引号,它解析与旧行为的命令。这就是为什么你需要用一组额外的"双引号来包围你的整个命令。

+0

我觉得你的解释还有一个缺失的部分,因为我只在命令开始处添加了1个额外的双引号以使其起作用,并且还给我留下了不均匀的引用量。如果我总是需要的话,我可以理解不同数量的报价,但只使用一对时,这不是必需的。我觉得这幅画还有另一部分。另外,我实际上并没有使用os.execute,但假设io.popen的工作原理相当公平吗? – fileinster 2014-12-06 22:17:53

+0

实际上,随着我对脚本的深入了解,我意识到,如果我在虚拟机名称之后放置任何内容(例如控制虚拟机状态),我发现我确实需要另一个双引号以增加我的数量引号。如果没有它,我不确定它是如何工作的,但我的理解足以满足我实用的好奇心。谢谢! – fileinster 2014-12-07 01:14:49

+1

从我所知道的情况来看,如果有一个开放的''',它将会保留任何剩余的东西,在你原来的情况下,'Cerium'之后没有任何东西可以工作,但是在这一点上它并没有与lua有很大关系,你必须看看'cmd.exe'是如何解析你传入的参数的。不幸的是,对于windows而言,这些规则变得相当混乱。请查看http://www.daviddeley.com/autohotkey/ parameters/parameters.htm如果你需要更多的细节。 – greatwolf 2014-12-07 01:36:42