Это сводит меня с ума. Я пытаюсь выполнить оператор командной строки в окне Windows для моего веб-приложения PHP. Он работает на Windows XP, IIS5.1. Веб-приложение работает нормально, но я не могу заставить @exec () работать с определенной контактной переменной. Моя командная конструкция выглядит так:
$cmd = ($config->svn." cat ".$this->repConfig->svnParams().quote($path).' -r '.$rev.' > '.quote($filename));
Эта команда не работает, как указано выше, когда генерирует следующую строку:
svn --non-interactive --config-dir /tmp cat "file:///c:/temp/test/acccount/dbo_sproctest.sql" -r 1 > "C:\Inetpub\sites\websvn\temp\wsv5B45.tmp"
Если я скопирую / вставлю это в свою командную строку, все будет работать нормально.
Если я жестко закодирую тот же самый путь вместо добавления его с переменной, это сработает! Я пробовал с и без кавычек вокруг имени файла. Я пробовал с и без кавычек вокруг всей команды. Я пробовал другие каталоги. Я попытался передать выходной параметр в exec (), и он возвращается пустым (Array ()). Я попытался перенаправить вывод потока ошибок команды в файл, и этот файл вывода ошибок никогда не создается.
Единственное, в чем я могу заключить, это то, что exec () молча завершается сбоем. Что, черт возьми, я здесь делаю не так? Если я жестко закодирую путь к файлу, используя ту же структуру dir и имя файла, он работает нормально. Если я этого не сделаю, это не так.
Возможно, косые черты () в пути к файлу не экранируются должным образом, но когда я делаю это вручную с одинарными кавычками, они не считаются escape-последовательностями ??
UPDATE:
Я снял @ с exec и до сих пор не вижу никаких ошибок.
Я дал полный путь к SVN, все еще не повезло. Следует отметить, что команда работала раньше с SVN с неполным путем, пока я вручную определяю назначение файла для cat.
Обновление 2: RE: Kieth
Я звоню exec, пробуя оба:
exec($cmd);
или
exec($cmd, $out);
Мой php.ini уже имел safe_mode = 0.
Я добавил error_reporting (E_ALL); и ничего нового не увидел
Если я повторяю (или print_r) мой вызов exec, я фактически не вижу что-либо
Если я повторяю (или print_r) мой вызов exec, когда включаю выходную переменную, я получаю пустое значение
Обновление 3
Я пробовал и escapeshellcmd, и escapeshellarg безрезультатно (хотя хорошая идея).
Я должен добавить, что файл создается путем вызова
tempnam("temp", "wbsn");
Тот факт, что все работает нормально, если я вручную указываю строку вместо того, чтобы дать ей сгенерировать временное имя, похоже, указывает на источник проблемы, но я не могу понять как. Я сравнил ручную строку с сгенерированной, и она вернулась как совпадение.