Захват кодов ошибок, возвращенных из пакетного файла в Perl - PullRequest
2 голосов
/ 25 февраля 2011

У меня есть файл perl, который вызывает командный файл для установки сторонней программы.

Main.pl

system ("Installer.bat");
print "Error code is $? \n";

Installer.bat

@echo off
installer.exe
echo errorlevel is %errorlevel% > logfile
exit %errorlevel%

Код ошибки 3010 возвращается пакетным файлом, и он предполагает, что требуется перезагрузка. Тем не менее, модуль Perl печатает 49664. Я думал, что это должно было напечатать 3010. Может кто-нибудь объяснить, как это работает? Я хочу получить код ошибки для перезагрузки, требуемой в моем Perl-коде, а затем выполнить некоторую работу по очистке и перезагрузить компьютер из модуля Perl.

Следующие связанные пункты также неясны. - Пакетные файлы Windows имеют только 255 кодов ошибок, так как можно вернуть 3010 в качестве кода ошибки? - Это место предполагает, что нам нужно сдвинуть код ошибки вправо на 8 бит, чтобы получить собственный код ошибки. Поэтому, если я сдвину 49664 вправо на 8, я получу 194 (что по-прежнему не совпадает с 3010). Однако я также отмечаю, что 3010 Mod 256 = 194

Ответы [ 2 ]

3 голосов
/ 25 февраля 2011

Per http://search.cpan.org/perldoc?IPC::System::Simple:

Начиная с IPC :: System :: Simple v0.06, подпрограмма run при вызове с несколькими аргументами сделает доступным полное 32-битное значение выхода в системах Win32.Это отличается от предыдущих версий IPC :: System :: Simple и встроенной в Perl функции system (), которая может обрабатывать только 8-битные возвращаемые значения.

0 голосов
/ 25 февраля 2011

Коды выхода в пакетных файлах повреждены , выход% errorlevel% установит код выхода для пакетного файла, но не процесс!

@echo off
set err=3010
@%COMSPEC% /C exit %err% >nul

Это установит код завершения процесса (вероятно, cmd.exe) на 3010.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...