7

os.execute()以前在lua中调用其他程序,程序运行时会弹出一个cmd窗口,一闪而过,调用execute超过百次,烦人。那么有没有办法让窗口不可见呢?

4

3 回答 3

7

我个人对“不,你不能”的回答并不满意,并且作为工程师类型的人只需要“解决那个问题”,我能够使用 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-10T21:00:51.003 回答
3

hjpotter 在评论中给出了简短的回答:不,你不能

接下来是更长的解释。

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

问题os.execute在于它在底层使用了 Csystem函数,而这又可能是通过执行 Windows 命令 shell 可执行文件来实现的cmd.exe,它一个命令行应用程序。因此,每次您使用时,os.execute您确实在执行cmd.exe. 该黑框是与cmd.exe正在执行相关联的控制台窗口。

于 2013-09-14T08:11:47.767 回答
2

我设想使用外星人库还有一个额外的解决方案。

Alien是一个以规范的方式使用 lua 访问 windows dll 的库。为了在不打开 shell 窗口的情况下执行命令文件,可以使用 中的函数ShellExecuteAShell32.dll可以在此处找到其文档,以下代码段描述了合适的方法。

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
    -- execute opening a window
    exec(0,"open","cmd.exe","/C "..cmd,0,3)
  else
    -- execute, no window opened
    exec(0,"open","cmd.exe","/C "..cmd,0,0)
  end
end

仅使用命令调用前一个函数,在不打开窗口的情况下运行它,使用两个操作数调用osexec ("dir", true)会打开一个窗口,对于调试目的很有用。

于 2015-04-16T14:44:52.583 回答