Как правильно обрабатывать пробелы в PHP Shell_exec?

Я работаю на сервере 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';