Perl :Получение правильного возвращаемого значения из & #39;system& #39; команда

Я новичок в Perl. У меня есть пакетный скрипт Windows, который содержит несколько команд NMake. Существующая проблема с этим пакетным скриптом заключается в том, что даже если команда NMake дает сбой во время ее выполнения, ERRORLEVELне устанавливается должным образом.

Таким образом, мы никогда не узнаем, сработала ли команда, пока не проанализируем файл журнала. Я изучил это, но не смог найти решение. Затем я подумал о преобразовании этого пакетного сценария в сценарий Perl, предполагая, что перехват ошибок будет проще, но, похоже, это не так просто.:)

Всякий раз, когда я запускаю свой сценарий Perl, команда «система» всегда возвращает 0. различные ссылки и понял, что получение правильного статуса возврата команды «система» не так просто. Тем не менее, я попробовал предложения, но ничего не работает.:(

Позвольте мне упомянуть, что вызываемая команда NMake, в свою очередь, вызывает множество различных команд во время своего выполнения. Например, упомянутый ниже вывод команды, который выдает «фатальную ошибку», на самом деле является частью Perl-скрипта (check _dir.pl ). Этот вызов скрипта Perl записан в самом файле NMake.

Если я вызову этот файл Perl(check_dir.pl)напрямую и проверю значение выхода, я получу правильный результат, т. е. команда завершится ошибкой и напечатает не -нулевое значение выхода (... неожиданно вернул значение выхода 2).

Пробовал системную функцию Perl, но это не помогло. Я использовал следующий код:

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;
}

Вывод:

.....  
.....  
Unable to open dir: R:\TSM_Latest  
Compressing...NMAKE : fatal error U1077: 'if' : return code '0x2'  
Stop.  
child exited with value 0

Также попробовал:

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";  
}

Наконец попробовал следующий модуль:

use IPC::Run qw( run timeout );  
run "nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1" or die "NMake returned $?";

Кажется, ничего не работает:(

Пожалуйста, поправьте меня, если я неправильно интерпретирую возвращаемое значение system.

5
задан Rooster 24 February 2014 в 23:21
поделиться