我正在編寫一個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
我覺得你的解釋還有一個缺失的部分,因爲我只在命令開始處添加了1個額外的雙引號以使其起作用,並且還給我留下了不均勻的引用量。如果我總是需要的話,我可以理解不同數量的報價,但只使用一對時,這不是必需的。我覺得這幅畫還有另一部分。另外,我實際上並沒有使用os.execute,但假設io.popen的工作原理相當公平嗎? – fileinster 2014-12-06 22:17:53
實際上,隨着我對腳本的深入瞭解,我意識到,如果我在虛擬機名稱之後放置任何內容(例如控制虛擬機狀態),我發現我確實需要另一個雙引號以增加我的數量引號。如果沒有它,我不確定它是如何工作的,但我的理解足以滿足我實用的好奇心。謝謝! – fileinster 2014-12-07 01:14:49
從我所知道的情況來看,如果有一個開放的''',它將會保留任何剩餘的東西,在你原來的情況下,'Cerium'之後沒有任何東西可以工作,但是在這一點上它並沒有與lua有很大關係,你必須看看'cmd.exe'是如何解析你傳入的參數的。不幸的是,對於windows而言,這些規則變得相當混亂。請查看http://www.daviddeley.com/autohotkey/ parameters/parameters.htm如果你需要更多的細節。 – greatwolf 2014-12-07 01:36:42