【问题标题】:How to keep os.execute(...) window open in Lua?如何在 Lua 中保持 os.execute(...) 窗口打开?
【发布时间】:2021-06-30 02:17:03
【问题描述】:

我有一个简单的 Lua 项目,每隔几分钟就会运行一个 NodeJS 脚本。 NodeJS 脚本设置一个函数 Interval 并每隔一秒左右向 API 发出一次请求。

我的 Lua 看起来像这样:

function Initialize()
    Running = false
end

function Update()
    if not Running then
        Running = true
        os.execute(table.concat({"npm", "i"}, " "))
        os.execute(table.concat({"npm", "start"}, " "))
    end
end

如何保持以os.execute() 打开的命令提示符窗口打开?命令完成后它会关闭,但我想在它关闭之前查看输出。不,我不想在我的 Lua 代码中看到结果,我只想看到窗口。

提前致谢!

编辑:我在 Windows 10 上运行

【问题讨论】:

  • os.execute 在 LUA 中的使用就像在 C 或 C++ 中使用函数 system。这意味着在 Windows 上执行 Windows 命令处理器 %SystemRoot%\System32\cmd.exe 和选项 /c 以在完成命令行执行后关闭命令进程,并将 LUA 脚本中定义的命令行作为附加参数附加。所以第一个os.execute 导致C:\Windows\System32\cmd.exe /c npm i 和第二个C:\Windows\System32\cmd.exe /c npm start 的执行。
  • 打开command prompt,运行cmd /? 并阅读输出帮助。解释了 Windows 命令处理器 cmd.exe 如何解释选项 /C 或选项 /K 之后的参数字符串,这将导致命令处理器在完成指定命令行的执行后保持运行。在命令提示符窗口中运行 where npm 并输出完整的限定文件名。您可以看到npm 在Windows npm.cmd 上,这是一个非常重要的批处理文件。
  • 您想用os.execute 执行的操作类似于start "NPM" %ComSpec% /D /E:ON /K "call npm.cmd i & call npm.cmd start"。这看起来很疯狂,确实如此。使用os.execute 的选项/c 启动Windows 命令处理器cmd.exe 以使用其内部命令start 执行命令行以使用标题为NPM 的新控制台窗口启动另一个命令进程,忽略AutoRun 注册表值并启用命令扩展以调用两次 npm.cmd 并保持第二个命令进程运行。

标签: cmd lua


【解决方案1】:
os.execute([[start "NPM" %ComSpec% /D /E:ON /K "call npm.cmd i & call npm.cmd start"]])

(基于 Mofi 的代码)

在同一窗口中按顺序运行 npm inpm start

os.execute([[start "npm i" %ComSpec% /D /E:ON /K "call npm.cmd i"]])
os.execute([[start "npm start" %ComSpec% /D /E:ON /K "call npm.cmd start"]])

在不同的窗口上依次运行 npm inpm start

说明:[[ 用于转义引号和 lua 序列。 start 运行带有一些选项的命令窗口并执行“npm i”。

我不确定call.cmd 是否是必要的(它不需要运行),但我一直坚持使用 Mofi 的建议。

【讨论】:

  • 谢谢!它可以在没有批处理文件的情况下工作,这真的很有帮助:)
猜你喜欢
  • 2013-09-18
  • 2020-11-08
  • 2013-06-01
  • 2021-11-15
  • 2021-11-01
  • 1970-01-01
  • 2012-09-03
  • 2012-03-03
  • 2010-10-02
相关资源
最近更新 更多