Perl: Przechwytywanie poprawnej wartości zwracanej z polecenia „system”

Jestem początkującym w Perlu. Mam skrypt wsadowy systemu Windows, który zawiera wiele poleceń NMake. Istniejący problem z tym skryptem wsadowym polega na tym, że nawet jeśli polecenie NMake nie powiedzie się podczas jego wykonywania,ERRORLEVEL nie jest prawidłowo ustawiony.

Więc nigdy nie wiemy, czy polecenie zadziałało, dopóki nie przeanalizujemy pliku dziennika. Sprawdziłem to, ale nie mogłem znaleźć rozwiązania. Następnie pomyślałem o przekonwertowaniu tego skryptu wsadowego na skrypt Perla, zakładając, że błąd zalewkowania będzie łatwiejszy, ale wygląda na to, że nie jest to takie proste :)

Za każdym razem, gdy uruchamiam skrypt Perla, polecenie „system” zawsze zwraca 0. Sprawdziłem wiele różnych łączy i zdałem sobie sprawę, że uchwycenie poprawnego statusu powrotu polecenia „system” nie jest takie proste. Mimo to wypróbowałem sugestie, ale rzeczy nie działają. :(

Wspomnę, że polecenie NMake, które z kolei jest wywoływane, wywołuje wiele różnych poleceń podczas jego wykonywania. Na przykład, poniższe polecenie wyjścia, które rzuca „błąd krytyczny”, jest w rzeczywistości częścią skryptu Perla (check_dir.pl). To wywołanie skryptu Perla jest zapisane w samym pliku NMake.

Jeśli zadzwonię do tego pliku Perla (check_dir.pl) bezpośrednio i sprawdź wartość wyjścia, otrzymuję poprawny wynik, tzn. polecenie nie działa i drukuje aniezerowy wartość wyjścia (...nieoczekiwanie zwrócono wartość wyjścia 2).

Próbowałem funkcji systemu Perla, ale to nie pomogło. Użyłem następującego kodu:

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

Wydajność:

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

Próbowałem również:

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

Na koniec wypróbowałem następujący moduł:

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

Nic nie wydaje się działać :(

Popraw mnie, jeśli interpretuję wartość zwracanąsystem nieprawidłowo.

questionAnswers(1)

yourAnswerToTheQuestion