Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么赢了';程序文件中的t应用程序在lua中使用os.execute运行?_Lua - Fatal编程技术网

为什么赢了';程序文件中的t应用程序在lua中使用os.execute运行?

为什么赢了';程序文件中的t应用程序在lua中使用os.execute运行?,lua,Lua,我正在尝试使用Lua的os.execute()函数运行一个可执行文件。如果我做了以下类似的事情,它将不起作用: os.execute("C:\\\Program Files\\\Movie Maker\\\moviemk.exe") 但是,如果我将lua文件放在moviemk.exe所在的路径中,它就可以调用它 你知道为什么会这样吗 另外,我正在使用Windows XP SP3,请尝试: os.execute("C:\\Program Files\\Movie Maker\\moviemk.

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

os.execute("C:\\\Program Files\\\Movie Maker\\\moviemk.exe")
但是,如果我将lua文件放在
moviemk.exe
所在的路径中,它就可以调用它

你知道为什么会这样吗

另外,我正在使用Windows XP SP3,请尝试:

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


“\”字符用于Lua中的转义字符。

这是命令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:\Program Files\Movie Maker\moviemk.exe
,在空白处拆分后,CMD试图找到名为
c:\program
的程序,以使用名为
files\movie
maker\moviemk.exe
的参数执行。这不是你想要的

解决办法是对报价采取更具防御性的态度

我将这样写:

os.execute [["C:\Program Files\Movie Maker\Moviemk.exe"]] os.execute[[“C:\Program Files\Movie Maker\Moviemk.exe”]] 如果要提供额外的命令行参数,我会在每个参数周围使用双引号,并且在参数之间使用一个空格。使用长字符串语法有一个优点,即反斜杠不是一个特殊字符,因此您不需要额外的倾斜牙签,从而更难读取字符串文字

在每个参数周围使用双引号应该可以在Windows和*nix上使用,当然,在这两种平台上很难找到相同的命令


另一个需要注意的细节是
\Programs Files
可能不在
C:
上。甚至可能没有名为
C:
的磁盘。(我的工作电脑从
E:
启动,我发现更多有缺陷的程序就是这样。)学习正确路径名的最简单方法是只使用环境变量
ProgramFiles
。还有很多其他的方法。

事实上,我想我已经找到了。我做了os.execute('C:\\\Program Files\\\Movie Maker\\\moviemk.exe“)…在“”周围的额外的“”似乎起到了作用。但对我来说似乎很奇怪。可能是某些文件名中的空格。Windows有时会与这些表单发生冲突。三个反斜杠太多了。如果将它们减少为两个,你可能会更幸运。 os.execute [["C:\Program Files\Movie Maker\Moviemk.exe"]]