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

时间:2010-08-27 20:11:20

标签: lua

我正在尝试使用Lua的os.execute()函数运行可执行文件。如果我做了类似下面的事情,它就不起作用了:

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

但是,如果我将我的lua文件放在moviemk.exe所在的同一路径中,那么它可以调用它。

为什么会出现这种情况?

P.S。我正在使用Windows XP SP3

2 个答案:

答案 0 :(得分:16)

这是命令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。还有很多其他方法。

答案 1 :(得分:1)

尝试:

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

或:

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

'\'字符用于Lua中的转义字符。