Forum: PC-Programmierung Win7x64/DOS/CMD-Batch: %errorlevel% kommt "manchmal" richtig raus?


von cppbert3 (Gast)


Lesenswert?

hab in einem anderen Post das gleiche Problem gepostet - aber im 
Zusammenhang mit Python - es scheint aber eher schon ein meinen CMD 
Verständnis zu hängen, also hab ich einen gesonderten Post gemacht nur 
auf diesem Thema bezogen

Problem: mein CMD Aufruf verhält sich nur deterministisch so lange ich 
keine anderen Kommandos zwischen drin aufrufe (oder so in der Art)

mini.bat
1
@echo off
2
set neue_var=neuer_wert
3
exit /b 123

als Hausaufgabe formuliert :)

"Ziel ist es das Environment und den ErrorLevel der Batch-Datei zu 
bekommen
ohne diese zu verändern oder eine weitere Batch-Datei drumherum zu 
bauen"

die Aufgabe löse ich mit:
1
mini.bat & echo %errorlevel% > errorlevel.txt & set > env.txt

in einem Kontext wird die test Batch-Datei gestartet, ihr errorlevel und 
das zu dem Zeitpunkt bestehende Environment in Dateien geschoben

funktioniert auch alles - nur mein Errorlevel verhält sich manchmal 
komisch

in der Konsole führe ich folgendes aus: (schön mit Cursor-Rauf und 
Enter)
1
1. mini.bat & echo %errorlevel% > errorlevel.txt & set > env.txt
2
--> in externem Editor sehe ich 123 in errorlevel.txt
3
2. mini.bat & echo %errorlevel% > errorlevel.txt & set > env.txt
4
--> in externem Editor sehe ich 123 in errorlevel.txt
5
3. type errorlevel.txt
6
--> printet 123 auf die Konsole
7
4. mini.bat & echo %errorlevel% > errorlevel.txt & set > env.txt
8
--> in externem Editor sehe ich 0 in errorlevel.txt ?????
9
5. mini.bat & echo %errorlevel% > errorlevel.txt & set > env.txt
10
--> in externem Editor sehe ich wieder 123 in errorlevel.txt

warum ist mein errorlevel plötzlich 0 wenn ich zwischendurch mal type
aufrufe?

das selbe passiert wenn ich den Testablauf in eine eigene Batch-Datei 
stecke

mini_run.bat
1
call mini.bat & echo %errorlevel% > errorlevel.txt & set > env.txt
2
pause
3
call mini.bat & echo %errorlevel% > errorlevel.txt & set > env.txt
4
pause
5
type errorlevel.txt
6
pause
7
call mini.bat & echo %errorlevel% > errorlevel.txt & set > env.txt
8
pause
9
call mini.bat & echo %errorlevel% > errorlevel.txt & set > env.txt
10
pause

kann mir das ein Batch-Guru erklären - oder meinen trivial "Fehler" 
aufzeigen?

von cppbert3 (Gast)


Lesenswert?

wenn ich die mini_run.bat so direkt im Explorer Aufrufe und in einem 
Editor die errorlevel.txt verfolge gibt es "manchmal" auch wechsel 
zwischen 0 und 123 - ich verstehe das nicht

von Jim M. (turboj)


Lesenswert?

Vorsicht: "Call" erzeugt einen neuen Befehlsinterpreter, der IIRC das 
Environment des Eltern-Prozesses nicht ändern kann. Das bedeutet auch 
das man das komplette Environment nur in der Batch Datei selbst 
rausextrahieren kann.

Errorlevel ist die Ausnahme, denn da wird einfach nur der Rückkehrcode 
nach Ausführung drin gespeichert.

von Erwin D. (Gast)


Lesenswert?

Jim M. schrieb:
> Errorlevel ist die Ausnahme, denn da wird einfach nur der Rückkehrcode
> nach Ausführung drin gespeichert.

Errorlevel ist aber was anderes als ExitCode:

https://ss64.com/nt/errorlevel.html

von cppbert3 (Gast)


Lesenswert?

Erwin D. schrieb:
> Jim M. schrieb:
>> Errorlevel ist die Ausnahme, denn da wird einfach nur der Rückkehrcode
>> nach Ausführung drin gespeichert.
>
> Errorlevel ist aber was anderes als ExitCode:
>
> https://ss64.com/nt/errorlevel.html

das ist klar - und warum bekomme ich, so lange ich nicht "type" Aufrufe 
,permanten die 123?

von cppbert3 (Gast)


Lesenswert?

cppbert3 schrieb:
> Erwin D. schrieb:
>
>> Jim M. schrieb:
>>> Errorlevel ist die Ausnahme, denn da wird einfach nur der Rückkehrcode
>>> nach Ausführung drin gespeichert.
>>
>> Errorlevel ist aber was anderes als ExitCode:
>> https://ss64.com/nt/errorlevel.html
>
> das ist klar - und warum bekomme ich, so lange ich nicht "type" Aufrufe
> ,permanten die 123?

Sorry ich hab nicht ordentlich gelesen, super link, erklärt so einige 
komische Verhaltensweisen

von Sascha (Gast)


Lesenswert?

Aufruf des Skriptes und Auswertung von errorlevel in 2 getrennte Zeilen 
schreiben. Ansonsten wird erst die ganze Zeile interpretiert, also 
%errorlevel% ersetzt durch aktuellen Wert, und dann erst die Zeile 
ausgeführt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.