2014-12-06 107 views
2

我正在編寫一個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

回答

2

問題與如何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