В моем пакетном файле у меня есть следующий код
SETLOCAL enabledelayedexpansion
7Z a -r ..\%ZIPNAME%.zip * >> uniqueid8.log
IF !ERRORLEVEL! GEQ 1 (
CALL :getLineNumber errLine uniqueID8 -2
PHP ..\..\shell_mailupdate.php ERROR !errLine! "7Z a -r ..\%ZIPNAME%.zip * >> ..\uniqueid8.log"
ENDLOCAL & EXIT /B
)
ENDLOCAL
:getLineNumber
- это функция для получения номера строки :
:::::::::::::::::::::::::::::::::::::::::::::
:GetLineNumber <resultVar> <uniqueID> [LineOffset]
:: Detects the line number of the caller, the uniqueID have to be unique in the batch file
:: The lineno is return in the variable <resultVar> add with the [LineOffset]
SETLOCAL
for /F " usebackq tokens=1 delims=:" %%L IN (`findstr /N "%~2" "%~f0"`) DO set /a lineNr=%~3 + %%L
(
ENDLOCAL
set "%~1=%LineNr%"
goto :eof
)
Shell_mailupdate.php - это php-скрипт, который отправляет мне информацию об ошибке.
Пакетный файл вызывается асинхронно из моего веб-приложения, используя эту функцию, найденную на странице exec php :
<?php
function execInBackground($path, $exe, $args = "") {
global $conf;
if (file_exists($path . $exe)) {
chdir($path);
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start \"bla\" \"" . $exe . "\" " . escapeshellarg($args), "r"));
} else {
exec("./" . $exe . " " . escapeshellarg($args) . " > /dev/null &");
}
}
}
?>
Когда вызывается пакетный файл (моя серверная ОС - Windows), я получаю письмо, в котором сообщается, что команда не работает и мой пакет прерывается.И когда я иду, чтобы увидеть unique8.log, он пуст.Но когда я пробую эту команду напрямую (заменив% ZIPNAME% на имя, которое я хочу) на сервере, она работает и создает мой zip-файл.Есть также другой вызов команды 7-zip для извлечения данных ранее в сценарии, но я подозреваю, что они тоже не сработали, так как данные не были извлечены.Но я знаю, что пакетный файл работает без проблем при запуске вручную.
Он не может быть получен из переменной, поскольку я знаю из своей почты, что он был правильно инициализирован.У меня также установлена последняя версия 7-zip.
РЕДАКТИРОВАТЬ: Для тех, кто задается вопросом, почему у меня такая конфигурация, мне нужно создать большой комплект из множества маленьких комплектов.Это включало распаковку небольшого пакета и перестановку их содержимого.Поскольку операция занимает много времени, я просто вызываю эту операцию в фоновом режиме и позволяю моему php-скрипту завершиться, не дожидаясь завершения операции, и он сообщает конечному пользователю, что письмо будет отправлено, как только операция завершится.
EDIT2: После того, как Wimmel советовал записать stderr в файл журнала, я получил следующее исключение:
Der Befehl "7Z" ist entweder falsch geschriebenoder konnte nicht gefunden werden.
Что примерно переводится в
Команда "7Z" либо написана неправильно, либо не найдена
Это странно, потому что, как я упоминал ранее, вызов пакетного скрипта вручную проходит без каких-либо исключений.