Perl: Erfassung von korrekten Rückgabewert von "system" - Befehl
Ich bin ein Anfänger in Perl. Ich habe eine Windows-batch-Skript enthält mehrere NMake-Befehle. Ein vorhandenes Problem mit diesem batch-Skript ist, dass selbst wenn der NMake-Befehl schlägt fehl, während der Ausführung, ERRORLEVEL
nicht richtig eingestellt.
Wir werden also nie wissen, ob der Befehl gearbeitet, bis wir analysieren die log-Datei. Ich sah hinein, konnte aber keine Lösung finden. Ich dachte dann, der Umwandlung dieses batch-Skript ein Perl-Skript unter der Annahme, dass trapping Fehler werden leichter, aber es scheint, es ist nicht so einfach 🙂
Immer wenn ich mein Perl-Skript, das 'system' Befehl gibt immer 0 zurück. Ich sah viele verschiedene links, und erkannte, dass die Erfassung der richtigen return-status von 'system' Befehl ist nicht so einfach. Trotzdem habe ich versucht, die Vorschläge, aber die Dinge sind nicht arbeiten. 🙁
Lassen Sie mich erwähnen, dass der NMake-Befehl, der aufgerufen wird, ruft wiederum viele verschiedene Befehle während der Ausführung. Zum Beispiel, die Ausgabe des Befehls, die unten erwähnt werden, die wirft 'fatal error', ist eigentlich ein Teil von einem Perl-Skript (check_dir.pl). Dieser Aufruf von Perl-Skript ist geschrieben in der NMake-Datei selbst.
Wenn ich rufe das Perl-Datei (check_dir.pl
) direkt und überprüfen Sie die exit-Wert, bekomme ich ein richtiges Ergebnis, d.h., der Befehl schlägt fehl, und druckt eine nicht-null - exit-Wert (...unerwartet zurückgegeben exit-Wert 2).
Versucht, das Perl-system-Funktion, aber es hat nicht geholfen. Ich verwendete den folgenden 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;
}
Ausgabe:
..... ..... Unable to open dir: R:\TSM_Latest Komprimieren...NMAKE : fatal error U1077: 'wenn' : Rückgabe-code "0x2' Stop. Kind verlassen mit dem Wert 0
Habe auch versucht:
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";
}
Schließlich versucht das folgende Modul:
use IPC::Run qw( run timeout );
run "nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1" or die "NMake returned $?";
Nichts scheint zu funktionieren 🙁
Bitte korrigiert mich, wenn ich die Interpretation der Rückgabewert von system
falsch.
InformationsquelleAutor Technext | 2012-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie:
Gegeben, dass Sie don ' T scheinen zu kümmern, die tatsächliche Ausgabe, können Sie versuchen,
Stellen Sie sicher, dass Sie umgehen
cmd.exe
und sehen, ob man etwas nützliches.Referenz, die exit-codes von nmake werden hier aufgelistet.
Ausführen des folgenden Programms:
produziert:
Folgende version:
produziert:
In der Tat, auch wenn ich
Bekomme ich die gleiche korrekte und erwartete Ausgabe.
Dito, wenn ich
Diese Beobachtungen führen mich zu folgenden Fragen:
Welche version von nmake verwenden Sie?
Ist die
/I
option in Kraft? Auch wenn Sie nicht setzen Sie es von der Kommandozeile, beachten Sie die folgenden:So, ich habe die folgenden Dateien:
Und lief:
gab mir den Ausgang:
wo die Letzte Zeile zeigt, dass der exit-status von nmake wurde ordnungsgemäß weitergegeben werden.
Fazit:
Sie haben ein anderes problem.
In der Tat, die OP später darauf hingewiesen, in den Kommentaren, dass:
Gegeben
tee
s Engagement in der pipeline ist, ist es nicht verwunderlich, dassnmake
s exit code verloren geht.tee
ist erfolgreich in der Lage, Prozess-Ausgangsdaten vonnmake
, damit es Erfolg gibt, und das ist der exit-code Ihres Skripts sieht.Daher, die Lösung ist das erfassen der Ausgabe des
nmake
selbst, entweder mitqx
(gepaart mit der entsprechenden Ebene der Fehlerüberprüfung) oder mitcapture
ausIPC::System::Simple
. Dann können Sie entscheiden, ob Sie möchten, drucken, die Ausgabe in einer Datei speichern, legen Sie Sie in eine E-Mail, etc ...system ("nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1 | C:\\tee2 $TEMP_DIR\\modules-nt_${platlogfile}");
und nichtsystem ("nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1");
Gestern, ich advertently entfernt die Protokollierung Teil ('pipe') denken, dass ich nur poste den relevanten code. Ich bin wirklich tut mir Leid Sinan! 🙁Es scheint die tee - Befehl war immer ein Erfolg, so dass der return-Wert stets 0. Bin ich im Recht? Nun, wenn ich meinen ursprünglichen Befehl mit "system" funktioniert wie erwartet:
use IPC::System::Simple qw(system); system ("nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat > $TEMP_DIR\\modules-nt_${platlogfile}");
Jetzt das einzige problem, das ich bin vor ist, sehe ich keine Ausgabe in der Konsole, weil alles wird immer umgeleitet in die Datei. Jede Hilfe in dieser Hinsicht?Vielen Dank für die Zeiger! Ich werde überprüfen
qx
undcapture
Sie können Schwanz log-Datei von separaten perl-Prozess oder thread. Ich weiß nicht, ist es möglich, auf einfache Weise auf windows.
InformationsquelleAutor Sinan Ünür