Почему приложения в Program Files не запускаются с использованием os.execute в lua? - PullRequest
3 голосов
/ 28 августа 2010

Я пытаюсь запустить исполняемый файл, используя функцию Lua os.execute().Если я делаю что-то вроде следующего, это не работает:

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

Однако, если я помещаю свой файл lua в тот же путь, что и moviemk.exe, он может вызвать его.

Есть идеи, почему это может быть?

PS Я использую Windows XP SP3

Ответы [ 2 ]

16 голосов
/ 28 августа 2010

Это классическая проблема с командной оболочкой. На самом деле это не специфическая проблема 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 и maker\moviemk.exe. Это не то, что вы хотели.

Решение состоит в том, чтобы быть гораздо более осторожным в цитировании.

Я бы написал так:

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

Если бы были указаны дополнительные аргументы командной строки, я бы использовал двойные кавычки вокруг каждого и один пробел между аргументами. Использование синтаксиса длинной строки [[...]] имеет то преимущество, что обратная косая черта не является специальным символом, поэтому вам не нужны дополнительные наклоняющиеся зубочистки, затрудняющие чтение строкового литерала.

Использование двойных кавычек вокруг каждого аргумента должно работать как в Windows, так и в * nix, хотя, конечно, сложнее найти команды, которые одинаковы на обеих платформах.

Еще одна деталь, о которой следует знать, это то, что \Programs Files может быть не включено C:. Может даже не быть диска с именем C:. (Мой рабочий компьютер загружается с E:, и я нахожу больше программ с ошибками.) Самый простой способ узнать правильный путь - просто использовать переменную окружения ProgramFiles. Есть много других способов.

1 голос
/ 28 августа 2010

Попробуйте:

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

или:

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

Символ '\' используется для escape-символов в Lua.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...