我os.execute()
以前在lua中调用其他程序,程序运行时会弹出一个cmd窗口,一闪而过,调用execute超过百次,烦人。那么有没有办法让窗口不可见呢?
3 回答
我个人对“不,你不能”的回答并不满意,并且作为工程师类型的人只需要“解决那个问题”,我能够使用 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
hjpotter 在评论中给出了简短的回答:不,你不能。
接下来是更长的解释。
在 Windows 上,可执行文件有“两种风格”:GUI 应用程序和命令行应用程序。这与程序的内部工作无关,但它取决于程序的构建方式(PE 可执行文件头中有一个标志,可以使用链接器选项设置)。执行命令行应用程序时,操作系统会自动弹出控制台窗口(“丑陋的黑匣子”)。
问题os.execute
在于它在底层使用了 Csystem
函数,而这又可能是通过执行 Windows 命令 shell 可执行文件来实现的cmd.exe
,它是一个命令行应用程序。因此,每次您使用时,os.execute
您确实在执行cmd.exe
. 该黑框是与cmd.exe
正在执行相关联的控制台窗口。
我设想使用外星人库还有一个额外的解决方案。
Alien是一个以规范的方式使用 lua 访问 windows dll 的库。为了在不打开 shell 窗口的情况下执行命令文件,可以使用 中的函数ShellExecuteA
:Shell32.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)
会打开一个窗口,对于调试目的很有用。