2010-08-27 57 views
3

我試圖運行使用Lua的os.execute()函數的可執行文件。如果我這樣做以下這是行不通的:爲什麼程序文件中的應用程序不能在lua中使用os.execute運行?

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

但是,如果我把我的LUA文件在同一路徑moviemk.exe是那麼它可以調用它。

任何想法,爲什麼這可能是?

P.S.我使用Windows XP SP3

+0

三個反斜槓太多了。如果你減少到兩個,你可能會有更多的運氣。 – 2011-05-16 22:54:06

回答

1

嘗試:

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

或:

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

的 '\' 字符用於在Lua轉義字符。

+0

其實我覺得剛剛算出來了。我做了os.execute('C:\\ Program Files \\\ Movie Maker \\\ moviemk.exe'')...「」附近的「」似乎在做伎倆。 – 2010-08-27 20:18:49

+0

它可能是某些文件名稱中的空格,Windows隨時都在與這些形式鬥爭。 – 2010-08-27 22:28:02

15

這是命令外殼的一個經典問題。這不是真正的Windows特定問題,除了* nix之外,人們從未真正習慣於在文件名中放置空格,並且Windows在幾個默認系統位置(如C:\Program Files)中放置空格。

發生什麼事是os.execute(str)是在ANSI C函數system(str)的實現,它在Windows上試圖複製鍵入"cmd /C "..str到命令提示符的效果。 (On * 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:的磁盤。 (我的工作電腦從E:啓動,我發現了更多的錯誤程序。)學習正確路徑名的最簡單方法是僅使用環境變量ProgramFiles。還有很多其他的方法。

相關問題