Perl: получение правильного возвращаемого значения из команды 'system'
Я начинающий в Perl. У меня есть пакетный скрипт Windows, который содержит несколько команд NMake. Существующая проблема с этим пакетным сценарием заключается в том, что даже если команда NMake завершится с ошибкой во время ее выполнения,ERRORLEVEL
неправильно настроен.
Поэтому мы никогда не узнаем, сработала ли команда, пока не проанализируем файл журнала. Я изучил это, но не смог найти решение. Затем я подумал о преобразовании этого пакетного сценария в сценарий Perl, предполагая, что ошибка перехвата будет легче, но кажется, что это не так просто :)
Всякий раз, когда я запускаю свой Perl-скрипт, «система» команда всегда возвращает 0. Я просмотрел много разных ссылок и понял, что получение правильного статуса возврата «системы» Команда не так проста. Тем не менее, я попробовал предложения, но все не работает. :(
Позвольте мне упомянуть, что вызываемая команда NMake, в свою очередь, вызывает много разных команд во время ее выполнения. Например, упомянутый ниже вывод команды, который выдает «фатальную ошибку», фактически является частью сценария Perl (check_dir.pl). Этот вызов Perl-скрипта записан в самом файле NMake.
Если я называю этот файл Perl (check_dir.pl
) directly и проверить выходное значение, я получаю правильный результат, то есть команда завершается неудачно и печатаетnon-zero выходное значение (...unexpectedly returned exit value 2).
Пробовал системную функцию Perl, но это не помогло. Я использовал следующий код:
<code>system ("nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1"); if ( $? == -1 ) { print "Command failed to execute: $!\n"; } elsif ( $? & 127 ) { printf "The child died with signal %d, %s a coredump\n", ( $? & 127 ), ( $? & 128 ) ? 'with' : 'without'; } else { printf "child exited with value %d\n", $? >> 8; } </code>
Выход:
..... ..... Unable to open dir: R:\TSM_Latest Compressing...NMAKE : fatal error U1077: 'if' : return code '0x2' Stop. child exited with value 0
Также попробовал:
<code>use IPC::System::Simple qw(system); my $exit_status = system ("nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1"); if ($exit_status != 0) { print "Failure"; exit 3; } else { print "Success"; } </code>
Наконец-то попробовал следующий модуль:
<code>use IPC::Run qw( run timeout ); run "nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1" or die "NMake returned $?"; </code>
Кажется, ничего не работает :(
Пожалуйста, исправьте меня, если я интерпретирую возвращаемое значениеsystem
неправильно.