我正在尝试使用Lua的os.execute()
函数运行可执行文件。如果我做了类似下面的事情,它就不起作用了:
os.execute("C:\\\Program Files\\\Movie Maker\\\moviemk.exe")
但是,如果我将我的lua文件放在moviemk.exe
所在的同一路径中,那么它可以调用它。
为什么会出现这种情况?
P.S。我正在使用Windows XP SP3
答案 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中的转义字符。