我正在尝试使用Lua的os.execute()
函数运行可执行文件.如果我做了类似下面的事情它不起作用:
os.execute("C:\\\Program Files\\\Movie Maker\\\moviemk.exe")
Run Code Online (Sandbox Code Playgroud)
但是,如果我把我的lua文件放在同一个路径中moviemk.exe
,那么就可以调用它.
任何想法为什么会这样?
PS我正在使用Windows XP SP3
RBe*_*eig 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
and maker\moviemk.exe
.这不是你想要的.
解决方案是在引用方面更具防御性.
我会这样写:
os.execute [["C:\Program Files\Movie Maker\Moviemk.exe"]]
如果要提供额外的命令行参数,我会在每个参数周围使用双引号,并在参数之间使用单个空格.使用长字符串语法[[...]]
的优点是反斜杠不是特殊字符,因此您不需要额外的倾斜牙签,因此更难以读取字符串文字.
在每个参数周围使用双引号应该适用于Windows和*nix,当然,在两个平台上找到相同的命令比较困难.
要注意的另一个细节是\Programs Files
可能没有C:
.甚至可能没有名为的磁盘C:
.(我的工作PC启动E:
,我发现了更多错误的程序.)学习正确路径名的最简单方法是使用环境变量ProgramFiles
.还有很多其他方法.