我正在尝试使用 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/