我很高興在Lua的windows系統中使用xzxx 在Windows中使用lua os.execute啓動一個沒有CMD閃存的程序
strProgram = '"C:\\Program Files\\Ps Pad\\PSPad.exe"'
strCmd = 'start "" '..strProgram
os.execute(strCmd)
啓動程序。這樣可以正常工作,啓動程序和腳本完成。 它如何在命令窗口閃爍幾分之一秒,是否有人從Lua啓動程序。
我很高興在Lua的windows系統中使用xzxx 在Windows中使用lua os.execute啓動一個沒有CMD閃存的程序
strProgram = '"C:\\Program Files\\Ps Pad\\PSPad.exe"'
strCmd = 'start "" '..strProgram
os.execute(strCmd)
啓動程序。這樣可以正常工作,啓動程序和腳本完成。 它如何在命令窗口閃爍幾分之一秒,是否有人從Lua啓動程序。
Lua的os.execute命令是基於C標準庫的「shell」函數。在Windows中,此函數將始終創建一個命令窗口,並且它將始終停止當前進程直到窗口結束。後者也發生在Linux中。
最終沒有辦法解決這個問題。不通過Lua標準API。由於Lua需要輕量級且獨立於平臺,因此不允許使用API來使用與操作系統相關的本機API。
最好的辦法是使用Lua Ex-Api模塊。這實際上是放棄了,你可能需要修補一些編譯器問題(我猜Windows端口不是他們的首要任務)。但是這是產生進程的合理好方法。您可以選擇等到自己完成,或讓它們平行運行。它不會拋出一個命令提示符窗口,除非應用程序本身使用它。
謝謝你,我恐怕看起來有點超出我的技能範圍,我會將它傳遞給軟件擁有Lua的人,看看他是否可以爲我添加一個函數,如果他將代碼指向他需要它。 – 2011-06-16 16:45:34
我相信至少有一種方法可以在不使用控制檯的情況下使用io.popen在沒有額外庫的情況下彈出窗口來執行命令。請看我的答案。 – 2015-04-15 12:58:31
這是一種在沒有控制檯窗口的情況下僅使用Lua標準API(即沒有額外的庫)來運行命令的方式。在Win7 x64上測試。
function exec_silent(command)
local p = assert(io.popen(command))
local result = p:read("*all")
p:close()
return result
end
編輯:請參閱下面的評論,它可能不適用於所有人。我不知道爲什麼。
這是我用來從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
如果你只是用'strProgram'代替strCmd'的'會發生什麼?換句話說,你真的需要'開始'嗎? – BMitch 2011-06-15 19:04:36
啓動的程序一直運行並且Lua腳本一直掛起直到程序關閉,命令窗口保持打開狀態。 – 2011-06-15 19:52:08
從文檔看,它們看起來像是通過OS shell運行它(對不起,我在Linux上,所以我無法自己測試)。除非有人知道Lua技巧,否則您可能需要使用執行'fork/exec'而不是'system'調用的主機語言(例如C)編寫自己的函數,並將該API導出到Lua。 – BMitch 2011-06-15 20:54:10