2011-06-15 189 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