【发布时间】: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在Windowsnpm.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并保持第二个命令进程运行。