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 неправильно.

Ответы на вопрос(1)

Ваш ответ на вопрос