在Windows中使用lua os.execute启动程序而无需CMD的闪烁。

我正在使用 Lua 从 Windows 系统中愉快地启动一个程序:

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

这个命令可以正确地启动程序并完成脚本。不过它会在瞬间闪现一个命令窗口,有没有人知道如何用 Lua 启动程序而不显示命令窗口呢?

原文链接 https://stackoverflow.com/questions/6362841

点赞
stackoverflow用户734069
stackoverflow用户734069

Lua 的 os.execute 命令基于 C 标准库的 "shell" 函数。在 Windows 中,此函数将始终创建一个命令窗口,并且它会一直阻塞您的当前进程,直到窗口完成。后者在 Linux 中也会发生。

最终没有办法规避此问题。不通过 Lua 标准 API。因为 Lua 需要轻量级和平台无关,API 不允许使用 OS 依赖的本机 API。

您最好使用Lua Ex-Api模块。它事实上是已被抛弃的软件,并且您可能需要修补一些编译器问题(我猜想 Windows 端口不是他们的首要任务)。但它是一个相当不错的生成进程的方式。您可以选择自己等待它完成,或让它们并行运行。而且它不会弹出一个命令提示窗口,除非应用程序本身使用一个。

2011-06-15 22:41:13
stackoverflow用户140367
stackoverflow用户140367

这是一种只使用 Lua 标准 API(即无额外库)而不需要控制台窗口来运行命令的方法。在 Win7 x64 上进行了测试。

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

编辑:请参见下面的评论,它可能不适用于所有人。我不确定为什么。

2015-04-15 12:57:32
stackoverflow用户6941109
stackoverflow用户6941109

这是我使用的从Lua调用批处理的代码片段,可能会有帮助。

在win控制台(命令提示符)中打开并执行,在unix(mac|nix)中相同。

-- 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
2016-10-08 11:04:31