Я работаю на сервере win2003, PHP 526, через командную строку.
У меня есть строка 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, выполняется успешно.
Как правильно обрабатывать пробелы в PHP shell_exec?






Используйте escapeshellarg (), чтобы избежать ваших аргументов, он должен экранировать его с помощью соответствующей комбинации кавычек и экранированных пробелов для вашей платформы (я предполагаю, что вы работаете в Windows).
Это тот ответ, который вы ищете :)
Разве вам не нравится согласованность именования функций в PHP? : - /
Это интересная проблема. Очевидно, PHP позволяет заключать программу или аргументы в двойные кавычки, но не то и другое вместе. Возможно, стоит сообщить об этом как об ошибке.
Обходной путь - использовать имя DOS 8.3 вместо кавычек. Например, «C: \ Program Files \» обычно становится «C: \ Progra ~ 1».
Была и такая проблема - пришла идея маршрутизировать запуск через cmd.exe. Уловка здесь в том, чтобы не потеряться в двойных кавычках. Обычно вы хотите поместить все, что хотите:
exec('cmd /c " '.$path.' "';
Где $ path - это уже заключенный в двойные кавычки путь к вашему исполняемому файлу. Пример:
$path = '"C:\Program Files\ToDoList Simple\ToDoList.exe" "C:\SomePath\todo.tdl" -nt test -cm test2';
В отличие от Unix, который требует экранирования кавычек внутри кавычек, Windows, похоже, не работает таким образом. Я не понимаю, как он отслеживает цитаты, но, похоже, это действительно работает, несмотря на всю логику об обратном:
$ cmd = '"" C: \ Path \ To \ Command "" Arg1 "" Arg2 ""';
$ fp = popen ($ cmd, 'r');
.
$ output = '';
в то время как ($ l = fgets ($ fp, 1024))
$ output. = $ l;
Я предполагаю, что command.exe берет общую строку команды и исключает (в противном случае избыточные) внешние кавычки. Без этих внешних кавычек DOS делает некоторые странные вещи. Это решение похоже на сообщение пользователя 187383, но устраняет "cmd / c", который только запутывает то, что на самом деле происходит, вместе с небольшим снижением производительности, поскольку cmd / c изначально неявно вызывается вызовом оболочки!
форматирование вашего вопроса отключено. используйте 4 пробела перед образцами кода!