【问题标题】:Why won't applications in Program Files run using os.execute in lua?为什么 Program Files 中的应用程序不能在 lua 中使用 os.execute 运行?
【发布时间】:2011-04-05 00:08:47
【问题描述】:

我正在尝试使用 Lua 的 os.execute() 函数运行可执行文件。如果我执行以下操作,它将不起作用:

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

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

任何想法为什么会这样?

附:我使用的是 Windows XP SP3

【问题讨论】:

  • 三个反斜杠太多了。如果你把它们减少到两个,你可能会有更多的运气。

标签: lua


【解决方案1】:

这是命令外壳的一个典型问题。这并不是一个真正的 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\moviemaker\moviemk.exe 的参数执行。这不是你想要的。

解决方案是在引用时更加防御。

我会这样写:

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

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

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

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

【讨论】:

    【解决方案2】:

    试试:

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

    或:

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

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

    【讨论】:

    • 其实,我想只是想通了。我做了 os.execute('C:\\\Program Files\\\Movie Maker\\\moviemk.exe"') ... "" 周围的额外 '' 似乎可以解决问题。不过对我来说似乎很奇怪.
    • 可能是某些文件名中的空格。 Windows 不时与这些形式作斗争。
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2017-04-08
    • 2010-10-19
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多