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

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

форматирование вашего вопроса отключено. используйте 4 пробела перед образцами кода!

user3850 18.12.2008 20:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
1
6 077
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Используйте escapeshellarg (), чтобы избежать ваших аргументов, он должен экранировать его с помощью соответствующей комбинации кавычек и экранированных пробелов для вашей платформы (я предполагаю, что вы работаете в Windows).

Это тот ответ, который вы ищете :)

Jay 19.12.2008 15:48

Разве вам не нравится согласованность именования функций в PHP? : - /

Artem Russakovskii 24.05.2009 09:07

Это интересная проблема. Очевидно, 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 изначально неявно вызывается вызовом оболочки!

Другие вопросы по теме