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

Bri*_*nan 3 lua

我正在尝试使用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\movieand maker\moviemk.exe.这不是你想要的.

解决方案是在引用方面更具防御性.

我会这样写:

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

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

在每个参数周围使用双引号应该适用于Windows和*nix,当然,在两个平台上找到相同的命令比较困难.

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