2011-06-15 188 views
8

我很高興在Lua的windows系統中使用xzxx 在Windows中使用lua os.execute啓動一個沒有CMD閃存的程序

strProgram = '"C:\\Program Files\\Ps Pad\\PSPad.exe"' 
strCmd = 'start "" '..strProgram 
os.execute(strCmd) 

啓動程序。這樣可以正常工作,啓動程序和腳本完成。 它如何在命令窗口閃爍幾分之一秒,是否有人從Lua啓動程序。

+0

如果你只是用'strProgram'代替strCmd'的'會發生什麼?換句話說,你真的需要'開始'嗎? – BMitch 2011-06-15 19:04:36

+0

啓動的程序一直運行並且Lua腳本一直掛起直到程序關閉,命令窗口保持打開狀態。 – 2011-06-15 19:52:08

+1

從文檔看,它們看起來像是通過OS shell運行它(對不起,我在Linux上,所以我無法自己測試)。除非有人知道Lua技巧,否則您可能需要使用執行'fork/exec'而不是'system'調用的主機語言(例如C)編寫自己的函數,並將該API導出到Lua。 – BMitch 2011-06-15 20:54:10

回答

7

Lua的os.execute命令是基於C標準庫的「shell」函數。在Windows中,此函數將始終創建一個命令窗口,並且它將始終停止當前進程直到窗口結束。後者也發生在Linux中。

最終沒有辦法解決這個問題。不通過Lua標準API。由於Lua需要輕量級且獨立於平臺,因此不允許使用API​​來使用與操作系統相關的本機API。

最好的辦法是使用Lua Ex-Api模塊。這實際上是放棄了,你可能需要修補一些編譯器問題(我猜Windows端口不是他們的首要任務)。但是這是產生進程的合理好方法。您可以選擇等到自己完成,或讓它們平行運行。它不會拋出一個命令提示符窗口,除非應用程序本身使用它。

+0

謝謝你,我恐怕看起來有點超出我的技能範圍,我會將它傳遞給軟件擁有Lua的人,看看他是否可以爲我添加一個函數,如果他將代碼指向他需要它。 – 2011-06-16 16:45:34

+0

我相信至少有一種方法可以在不使用控制檯的情況下使用io.popen在沒有額外庫的情況下彈出窗口來執行命令。請看我的答案。 – 2015-04-15 12:58:31

0

這是一種在沒有控制檯窗口的情況下僅使用Lua標準API(即沒有額外的庫)來運行命令的方式。在Win7 x64上測試。

function exec_silent(command) 
    local p = assert(io.popen(command)) 
    local result = p:read("*all") 
    p:close() 
    return result 
end 

編輯:請參閱下面的評論,它可能不適用於所有人。我不知道爲什麼。

+0

Negative,Win7 64位,它的行爲與只是popen或執行相同(Lua 5.2.3,鏈接) – handle 2015-08-07 15:17:15

+0

@handle然後,我們的設置顯然有些不同。我幾乎每天都在構建系統中使用這些代碼,並且根本沒有命令窗口彈出。 – 2015-08-08 09:31:31

+0

不要懷疑你,只是準備其他人,儘管你的成功,這可能無法正常工作。 – handle 2015-08-10 07:53:25

1

這是我用來從Lua調用批處理的一段代碼,可能有幫助。 在贏控制檯(命令提示符)打開並執行,同時在UNIX(MAC |尼克斯)

-- sBatchFile = .bat for windows, .sh for x 
function vfFork2(sBatchFile) 
    local b = package.cpath:match("%p[\\|/]?%p(%a+)") 
    if b == "dll" then 
     -- windows 
     os.execute('start cmd /k call "'..sBatchFile..'"') 
    elseif b == "dylib" then 
     -- macos 
     os.execute('chmod +x "'..sBatchFile..'"') 
     os.execute('open -a Terminal.app "'..sBatchFile..'"') 
    elseif b == "so" then 
     -- Linux 
     os.execute('chmod +x "'..sBatchFile..'"') 
     os.execute('xterm -hold -e "'..sBatchFile..'" & ') 
    end 
end