【问题标题】:how to avoid popup a window when use os.execute in lua在lua中使用os.execute时如何避免弹出窗口
【发布时间】:2013-09-18 20:00:32
【问题描述】:

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

【问题讨论】:

  • 除非该命令提供安静的执行模式,否则不会。许多程序都有-q--quiet-d--daemon 的可选参数以保持隐藏状态。
  • 如果您可以访问 LuaCom 模块,根据您尝试执行的操作,您可能可以使用直接的 windows api(假设您在 windows 上运行。交替检查您的主机应用程序是否支持shellexecute。见stackoverflow.com/questions/6362841/…
  • 你在运行什么命令?

标签: windows lua


【解决方案1】:

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

【讨论】:

  • 谢谢。经过一些实验,我发现要在不闪烁窗口的情况下执行“shellexecute”,您不能执行 Shell:Run("start url", 0),但必须执行 Shell:Run("cmd /C start url", 0)。也许这对其他看这里的人有帮助。
【解决方案2】:

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

下面是更长的解释。

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

os.execute 的问题在于它是uses C system function under the hood,而这又可能是通过执行 Windows 命令 shell 可执行文件cmd.exe 来实现的,它一个命令行应用程序。因此,每次您使用os.execute 时,您确实在执行cmd.exe。那个黑框是与正在执行的cmd.exe 关联的控制台窗口。

【讨论】:

  • 感谢您的回答!非常有帮助。
  • 这似乎不是真的。 os.execute("sleep 5") 不显示命令行窗口。可能是他正在执行的程序正在创建自己的窗口。
  • @ColonelThirtyTwo 您使用的是 Windows 操作系统吗? AFAIK sleep 不是 Windows 默认命令(除非他们在 Windows 7 中添加了它,我现在手头没有)。
  • @LorenzoDonati 是的,我使用的是 Windows 7。来自 msys 的 sleep,但这不是重点。我也可以在 cmd.exe 下运行的 Lua shell 中执行os.execute('"C:/Program Files (x86)/Lua5.1/lua.exe"'),它将在同一个终端窗口中运行。
  • @ColonelThirtyTwo 那我没看错。我从未说过 os.execute 创建 additional cmd.exe windows。我说过你无法避免创建一个
【解决方案3】:

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

Alien 是一个使用 lua 以规范的方式访问 windows dll 的库。为了在不打开 shell 窗口的情况下执行命令文件,可以使用来自 Shell32.dll 的函数 ShellExecuteA:它的文档可以在 here 找到,下面的 sn-p 描述了合适的方法。

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) 会打开一个窗口,可用于调试目的。

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2012-05-27
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多