Я работаю на сервере win2003, PHP 526, через CMD-линию.
У меня есть строка cmdline:
$cmd = ' "d:\Prog Files\foo.exe" -p "d:\data path\datadir" ';
Попытка сделать это в php-коде
$out = `$cmd`; # note use of backticks AKA shell_exec
приводит к ошибке foo.exe, поскольку он интерпретирует -p arg как «d: \ data».
Тем не менее, те же строки $cdm
скопированные в оболочку windows cmdline, выполняются успешно.
Как правильно обрабатывать пробелы в PHP shell_exec
?
Используйте escapeshellarg (), чтобы избежать ваших аргументов, он должен избегать его с соответствующей комбинацией кавычек и экранированных пространств для вашей платформы (я предполагаю, что вы в Windows).
В отличие от Unix, которая требует, чтобы кавычки в кавычках были экранированы, Windows, похоже, не работает таким образом. То, как он отслеживает цитаты, находится вне меня, но на самом деле это работает, несмотря на всю логику обратного:
$ cmd = '"" C: \ Path \ To \ Command "" Arg1 "" Arg2 ""';
$ fp = popen ($ cmd, 'r');
$ Выход = '';
while ($ l = fgets ($ fp, 1024))
$ Выход = $ л.
Я предполагаю, что command.exe принимает итоговую командную строку и фиксирует (в противном случае избыточные) внешние кавычки. Без этих внешних кавычек DOS делает некоторые странные вещи. Это решение похоже на сообщение пользователем187383, но устраняет «cmd / c», который только запутывает то, что на самом деле происходит вместе с умеренным снижением производительности, поскольку cmd / c неявно используется вызовом оболочки в первую очередь!
Это интересная проблема. По-видимому, PHP позволяет вводить двойные кавычки вокруг программы или аргументов, но не обе. Возможно, стоит сообщить об этом как об ошибке.
Работа вокруг заключается в использовании имени DOS 8.3 вместо кавычек. Например, «C: \ Program Files \» обычно становится «C: \ Progra ~ 1».
Если бы эта проблема тоже возникла, возникла идея маршрутизации запуска через cmd.exe. Трюк здесь заключается не в том, чтобы заблудиться в двойных qoutes. Как правило, вы хотите поместить все, что вы хотите запустить:
exec('cmd /c " '.$path.' "';
Где $ path – это уже двойной путь к вашему исполняемому файлу. Пример:
$path = '"C:\Program Files\ToDoList Simple\ToDoList.exe" "C:\SomePath\todo.tdl" -nt test -cm test2';