如何在Lua中使用os.execute时避免弹出窗口

我正在使用 os.execute() 在 Lua 中调用其他程序,当程序运行时,命令行窗口会闪烁一下,我调用 execute 超过一百次,这变得非常烦人。 所以有没有办法将窗口设置为不可见?

点赞
用户2633423
用户2633423

短暂的回答在hjpotter的评论中得到了解答:**不行**。

以下是更详细的解释。

在Windows中,可执行文件有两种类型:GUI应用程序命令行应用程序。这与程序的内部工作方式无关,而是取决于程序的构建方式(在PE可执行文件头中有一个标志,可以使用链接器选项来设置)。每当执行命令行应用程序时,操作系统自动弹出控制台窗口(即“丑陋的黑盒子”)。

os.execute的问题在于它在底层使用了C语言的system函数,而system函数又可能是通过执行Windows命令行可执行文件cmd.exe来实现的,该文件确实是一个命令行应用程序。因此,每次使用os.execute时,实际上都在执行cmd.exe。那个黑盒子就是与正在执行的cmd.exe相关联的控制台窗口。

2013-09-14 08:11:47
用户3088599
用户3088599

我个人对于“不行”的答复并不满意,因为我是一个工程师类型的人,必须“解决那个问题”,所以我使用了WScript.Shell,让事情能够起作用:

Shell = luacom.CreateObject("WScript.Shell")
Shell:Run (command, 0)

“0”用于阻止弹出窗口出现。 http://msdn.microsoft.com/en-us/library/d5fk67ky%28v=vs.84%29.aspx

2013-12-10 21:00:51
用户4797142
用户4797142

有一个额外的解决方案,我想使用 alien 库实现。

Alien 是一个访问 Windows dll 的库,可以以一种有规律的方式使用 Lua 进行访问。为了在不打开 shell 窗口的情况下执行命令文件,可以使用 Shell32.dll 中的函数 ShellExecuteA:其文档可以在这里找到,适当的方法由下面的片段描述。

require 'alien'
local shell32 = alien.load('Shell32.dll')
shell32.ShellExecuteA:types("pointer","pointer","pointer","pointer","pointer","pointer","int")
local exec = shell32.ShellExecuteA

function osexec(cmd, open)
  if open then
    -- 执行并打开一个窗口
    exec(0,"open","cmd.exe","/C "..cmd,0,3)
  else
    -- 执行,不打开窗口
    exec(0,"open","cmd.exe","/C "..cmd,0,0)
  end
end

调用前面的函数只需使用命令即可,在不打开窗口的情况下运行。调用两个操作数 osexec ("dir", true) 则打开一个窗口,非常适合调试。

2015-04-16 14:44:52