Fehlerstufe immer 0 in Batchdatei

917
Paulo Francisco Santos

Ich versuche, ein automatisiertes Implementierungsskript von einem Windows-Image aus einzurichten. Während des Testens stoße ich auf ein Problem bezüglich des Teils, der versucht zu fangen, wenn bei bestimmten Befehlen etwas schiefgelaufen ist.

Anstatt das Skript zu stoppen, glaubt das Skript weiterhin, dass es erfolgreich ist, und fährt mit dem nächsten Befehl fort, obwohl der vorherige Befehl einen Fehler festgestellt hat.

Ich habe versucht else, den Abschnitten eine hinzuzufügen, um zu sehen, was schief gelaufen ist, und habe nach der Ausführung des Befehls festgestellt, dass die Fehlerstufe 0 ist. Es sei denn, das Echo stellt selbst eine Fehlerstufe ein. Hier ist der relevante Abschnitt des Codes.

Edit: Ich habe die Hauptursache für diesen Codeabschnitt isoliert. Ich habe auch den Schritt imagex losgelassen, um die Komplexität und die Variablen zu reduzieren.

@echo off setlocal  set /p i_understand="Begin failure test? (Y/N) "  if "%i_understand%"=="Y" ( rem Deliberately causing diskpart to fail by using a nonexistent file. diskpart /s doesnotexist.txt if %ERRORLEVEL% NEQ 0 ( echo Diskpart failed and caught. endlocal exit /b 1 )  echo Diskpart failed but not caught. Error level is %ERRORLEVEL% ) else ( echo Variable i_understand is %i_understand% echo Aborting. ) 

Wenn ich den Code auf den folgenden Code reduziere, ist die Fehlerstufe richtig eingestellt:

@echo off setlocal rem Deliberately causing diskpart to fail by using a nonexistent file. diskpart /s doesnotexist.txt if %ERRORLEVEL% NEQ 0 ( echo Diskpart failed and caught. endlocal exit /b 1 ) 

Die Idee war, Warnungen anzuzeigen und dann eine abschließende Antwort mit einem "Y" zu erhalten. Ja, ich weiß, dass dieses Skript gefährlich ist und ich weiß, was ich mache. bevor Sie mit anderen Eingaben fortfahren, die als Sicherheitsverweigerung interpretiert werden.

Natürlich können während des Prozesses viele Dinge schief gehen. Möglicherweise wird die Verbindung zum Netzlaufwerk unterbrochen, das Ziellaufwerk kann aufgrund eines Fehlers nicht erreichbar sein, oder etwas Unvorhergesehenes führt dazu, dass einer der Befehle fehlschlägt. In diesem Fall stoppt das Skript das, was es tut, und speichert bis zu diesem Punkt ein Protokoll der Konsolenausgabe.

Natürlich stieß ich bei meinen Tests auf eine Reihe von Fehlern aufgrund falsch konfigurierter Variablen, aber das Skript ruckte weiter, als wäre nichts passiert.

1
Sie haben keine Fehlerbehebung vorgenommen, um Ihr Problem zu beheben. Vereinfachen Sie es, indem Sie beispielsweise sehen, ob Sie das Problem ohne Verweise auf ein H-Laufwerk replizieren können. barlop vor 5 Jahren 5
Ihre Batchdatei enthält zwei Tests, einen mit diskpart und einen mit imagex. Wir haben alle Diskpart, wir haben nicht alle ImageX. Warum löschen Sie das Teil nicht mit imagex und zeigen nur das Diskpart, wenn das Teil tatsächlich nicht wie erwartet funktioniert. barlop vor 5 Jahren 4
Grundlegende Tests können auch zeigen, dass das Echo keinen Einfluss auf den Errorlevel hat. Warum also fragen, ob dies der Fall ist, wenn Sie so einfach testen und selbst sehen können barlop vor 5 Jahren 4
Siehe https://pastebin.com/raw/cswe0LqE den ersten Teil Ihrer Batchdatei. Die Ergebnisse sind für mich wie erwartet. Geschieht dies nicht für Sie? Und ich bekomme dasselbe (erwartete) Ergebnis auch mit einer Batchdatei barlop vor 5 Jahren 4
Danke für die Tipps. Ich fühle mich dumm. Das Ausprobieren der Codebits scheint zu funktionieren. Möglicherweise ist dafür etwas verantwortlich, das zuvor im gesamten Skript aufgetreten ist. Ich komme mit einem Update zurück. Paulo Francisco Santos vor 5 Jahren 4
Es ist normal, auf ein Problem zu stoßen, auf das Sie auch immer stoßen, und wenn Sie das Problem finden, sieht es so aus, als wäre es etwas Dummes / Offensichtliches, wenn Sie es wissen, aber wenn Sie es nicht wissen, ist es nicht Dumm / Offensichtlich. Und in der Realität, da man nicht weiß, wann es ist, ist es nicht dumm / offensichtlich. Alle Probleme sind so. Und es wird sich herausstellen, dass es irgendwo klein und flattig ist, etwas, das übersehen wird. Der Schlüssel liegt jedoch darin, die richtige Frage zu stellen, die Sie zur Antwort führt. Und der Schlüssel dazu ist eine korrekte Fehlerbehebung, indem das Problem auf einfachere Weise reproduziert wird (oder versucht wird, zu reproduzieren). barlop vor 5 Jahren 4
Update hinzugefügt Es ist ziemlich groß, also habe ich meine ursprüngliche Frage ein bisschen bearbeitet. Paulo Francisco Santos vor 5 Jahren 4
Ich habe diskpart bisher noch nicht mit einem Skript ausgeführt, aber nur um klar zu sein, wird die diskpart-Zeile und dann die nächste Zeile ausgeführt. Wenn also ein Fehler in dem an diskpart eingespeisten Skript vorliegt, ist der Fehler nicht der Fall Wenn diskpart beendet wird, führt diskpart das Skript weiter aus. Wenn das an diskpart übergebene Skript keinen Fehler enthält, führt diskpart das Skript weiter aus. Was Sie tun können, ist, nach der diskpart-Zeile etwas Code zu schreiben, der bestimmt, ob es erfolgreich funktioniert hat barlop vor 5 Jahren 4
oder diskpart beiseite, für den Fall Ihrer Bildzeile, zB für Ihre imagex-Zeile, wären Code-Nachwörter vielleicht, wenn die erwartete Datei ausgegeben wird und die erwartete Größe hat. barlop vor 5 Jahren 4
Interessante Perspektive für diskpart, aber das ist nicht das Thema, das ich teste, obwohl ich es später versuchen sollte. Die Sache hier ist, ich habe versucht, diskpart zum Scheitern zu zwingen, indem ich bat, eine nicht vorhandene Skriptdatei aufzurufen. An sich funktioniert es einwandfrei: diskpart meldet, dass es die Datei nicht finden kann, und das Skript kommt zum `exit / b'-Bit, wodurch das Skript vorzeitig beendet wird. Wenn ich es jetzt jedoch in den Teil stecke, der jetzt nach Benutzereingaben sucht, wird diskpart immer noch beendet, da versucht wird, eine nicht vorhandene Datei zu finden, aber "% ERRORLEVEL%" ist aus irgendeinem Grund immer noch 0. Paulo Francisco Santos vor 5 Jahren 4
Es ist schon eine Weile her, seit ich mich mit setlocal beschäftigt habe, aber ich stelle fest, dass, wenn Sie setlocal und endlocal entfernen, der errorlevel richtig erscheint. Auch diese Zeile `echo Diskpart failed 'ist ein bisschen mitten im Nirgendwo . Ob es ausgeführt wird oder nicht, ändert sich beim Entfernen von setlocal und endlocal barlop vor 5 Jahren 4

0 Antworten auf die Frage