Я новичок в 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
.