lua - 为什么程序文件中的应用程序不能在 lua 中使用 os.execute 运行?

标签 lua

我正在尝试使用 Lua 的 os.execute() 运行可执行文件功能。如果我执行以下操作,则它不起作用:

os.execute("C:\\\Program Files\\\Movie Maker\\\moviemk.exe")

但是,如果我将我的 lua 文件放在与 moviemk.exe 相同的路径中在然后它可以调用它。

任何想法为什么会这样?

附言我使用的是 Windows XP SP3

最佳答案

这是命令 shell 的经典问题。这并不是 Windows 特有的问题,除了在 *nix 上,人们从来没有真正养成在文件名中放置空格的习惯,而 Windows 将空格放置在几个默认的系统位置,例如 C:\Program Files .

发生的事情是os.execute(str)是根据 ANSI C 函数实现的 system(str) ,它在 Windows 上试图复制输入 "cmd /C "..str 的效果到命令提示符。 (在 *nix 上,它使用/bin/sh -c 而不是 cmd/C。)

经典的问题是,这必须在空格处拆分完整的命令字符串,以决定要运行的程序以及它的参数是什么。

您的原始示例:os.execute("C:\\Program Files\\Movie Maker\\moviemk.exe")有效地变成了cmd /c c:\program files\movie maker\moviemk.exe ,在将其拆分为空格后,CMD 试图找到一个名为 c:\program 的程序使用名为 files\movie 的参数执行和 maker\moviemk.exe .这不是你想要的。

解决方案是对引用更加谨慎。

我会这样写:

os.execute [["C:\Program Files\Movie Maker\Moviemk.exe"]]

如果要提供额外的命令行参数,我会在每个参数周围使用双引号,并在参数之间使用一个空格。使用长字符串语法 [[...]]具有反斜杠不是特殊字符的优点,因此您不需要额外的倾斜牙签,从而更难阅读字符串文字。

在每个参数周围使用双引号应该在 Windows 和 *nix 上都可以使用,当然,虽然在两个平台上更难找到相同的命令。

另一个需要注意的细节是 \Programs Files可能不在 C: .甚至可能没有名为 C: 的磁盘. (我的工作 PC 从 E: 启动,我发现更多错误的程序是这样的。)了解正确路径名的最简单方法是使用环境变量 ProgramFiles。 .还有很多其他的方法。

关于lua - 为什么程序文件中的应用程序不能在 lua 中使用 os.execute 运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3587788/

相关文章:

lua - 将Lua中每个单词的首字母大写

Lua 文件到数组

c# - 将 Lua 脚本加载到以文件名命名的表中

json - Lua 和 API 需要身份验证 (Wordnik)

lua - 我在表中有一组键,但我不知道如何检查它

Lua如何在小写字母和大写字母之间添加空格

timer - 如果 NodeMCU 计时器中的代码在我设置的计时器间隔内执行,会发生什么情况?

c - 在 Lua 中包含 C 库

object - 在 Lua 中,如何找出存储对象的键?

lua:如何在 __tostring 元方法中获取原始字符串?