В моем командном файле у меня есть следующий код
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-скрипт, который отправляет мне информацию об ошибках.
Пакетный файл вызывается асинхронно из моего веб-приложения с помощью этой функции, найденной на исполняемая страница 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.
EDIT: Для тех, кто задается вопросом, почему у меня такая конфигурация, мне нужно создать большой пакет из множества маленьких пакетов. Это включало распаковку маленького пакета и перестановку их содержимого. Поскольку операция занимает много времени, я просто вызываю эту операцию в фоновом режиме и позволяю моему php-скрипту завершиться, не дожидаясь завершения операции, и он сообщает конечному пользователю, что почта будет отправлена, как только операция завершится.
EDIT2: После того, как я последовал совету Wimmel записать stderr в файл журнала, я получил следующее исключение:
Der Befehl "7Z" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
Что грубо переводится в
Команда "7Z" написана неправильно или не найдена
Это странно, потому что, как я упоминал ранее, вызов пакетного сценария вручную проходит гладко без такого исключения.