kriegstreiber
Goto Top

Choice Befehl mit Errorlevel funktioniert nicht korrekt

Das ist mir echt peinlich, aber ich bin ratlos. Das schlimme ist, ich habe derweil Funktionen schon 1000x in Batch geskriptet, noch nie stand ich vor dem Problem wie jetzt. Ich habe schon in anderen Batch Skripten von mir geschaut, wo diese Funktion einwandfrei lüppt, nur hier nicht. Um was geht es:

Ich habe ein kleines Menu in Batch gemacht. Mittels Choice kann man dort einzelne Punkte ändern. Nun ist das Menu quasi so aufgebaut:

1.
2.
3.
4.
5.

Wenn ich jetzt die 3 drücke, sollte sich der echo Eintrag bei 3 ändern und das tut er leider nicht. Es ändern sich immer die darüberliegenden Einträge mit. Sprich drücke ich "4" ändert sich auch 1,2,3. Bei 3 dann 1,2. Ich habe zum testen mal einen Skriptschnipsel, einfach in einer Batch abspeichern und testen, dann seht ihr was ich meine. Wie gesagt, ich habe solche "Menus" schon 1000x gebaut, hat immer 1a funktioniert, nur dieses mal nicht.

Kann mir jemand sagen wo mein Fehler hier liegt?

@echo off
set "CONVERT=PROFILE 8"  
set "CROP=NO"  
set "BL=NO"  
set "EL=NO"  
set "RPU=YES"  
:BEGIN
cls
echo.
echo == MENU ================================================================================================================
echo.
echo 1. SAVE HDR BL         : [%BL%]
echo 2. SAVE DoVI EL        : [%EL%]
echo 3. SAVE RPU            : [%RPU%]
echo 4. Convert RPU to      : [%CONVERT%]
echo 5. Crop RPU            : [%CROP%]
echo.
echo S. START
echo.
echo Change Settings and press [S] to start Extracting^!
CHOICE /C 12345S /N /M "Select a Letter 1,2,3,4,5,[S]tart"  
IF errorlevel 6 goto DV7EXT
IF errorlevel 5 (
	if "%CROP%"=="NO" set "CROP=YES"  
	if "%CROP%"=="YES" set "CROP=NO"  
)
IF errorlevel 4 (
	if "%CONVERT%"=="LEAVE UNTOUCHED" set "CONVERT=PROFILE 8"  
	if "%CONVERT%"=="PROFILE 8" set "CONVERT=LEAVE UNTOUCHED"  
)
IF errorlevel 3 (
	if "%RPU%"=="NO" set "RPU=YES"		  
	if "%RPU%"=="YES" set "RPU=NO"  
)
IF errorlevel 2 (
	if "%EL%"=="NO" set "EL=YES"  
	if "%EL%"=="YES" set "EL=NO"  
)
IF errorlevel 1 (
	if "%BL%"=="NO" set "BL=YES"  
	if "%BL%"=="YES" set "BL=NO"  
)
goto BEGIN


EDIT: Ändere ich IF errorlevel 2in IF %errorlevel%==2 funktioniert es wie gewollt. Aber so habe ich das noch nie gemacht, ich möchte gerne verstehen warum es so wie hier im Beispiel nicht geht, obwohl es sonst immer ging. face-sad.

Content-ID: 1688925138

Url: https://administrator.de/contentid/1688925138

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

rubberman
Lösung rubberman 04.01.2022 um 15:51:53 Uhr
Goto Top
IF ERRORLEVEL N ... ist ein Erbe aus DOS Tagen und bedeutet "Wenn der ERRORLEVEL Wert größer oder gleich N ist, dann ...". Heißt, du kannst nicht einfach IFs untereinander stapeln, sondern musst dich vom größten zum kleinsten Wert (hast du richtig gemacht) mit ELSE IF (hast du falsch gemacht) nach unten durchhangeln.

Steffen
Kriegstreiber
Kriegstreiber 04.01.2022 um 15:56:28 Uhr
Goto Top
Das ergibt Sinn, wundere mich nur warum es in anderen Scripts auf diese Weise funktioniert. Auch ohne "ELSE IF". Ich habe das jetzt aber auf die schnelle mit IF "%ERRORLEVEL%"=="2" gelöst, so funktioniert es dann auch einwandfrei und werde das in Zukunft dann auch immer so handhaben. Danke rubberman.
rubberman
rubberman 04.01.2022 aktualisiert um 16:37:31 Uhr
Goto Top
warum es in anderen Scripts auf diese Weise funktioniert
Weil du mit GOTOs deinen Programmfluss kaputt gemacht hast und nach dem ersten Match das nächste IF gar nicht mehr erreicht hast da du schon längst wie wild irgendein Label angesprungen hast? face-wink

BTW Selbst wenn du mit der %ERRORLEVEL% Variable arbeitest, ist ELSE IF semantisch immer noch sinnvoller. Egal.

Steffen
WinCobold
WinCobold 05.01.2022 um 15:33:28 Uhr
Goto Top
Hallo, Mensch mit dem nicht zitierfähigen Namen,

das Problem ist, dass bei den Abfragen auf niedrigere Werte als dem, den du eingegeben hast, die Bedingung ebenfalls erfüllt ist: Wenn du 3 drückst, ist dieser Wert natürlich auch "größer oder gleich 2". Die Abfrage auf die Umgebungsvariable reagiert dagegen nur auf den exakten Wert, weil du ja auf "gleich" abfragst.

Aber wenn du im IF einen Befehl verwendest, der selber den Errorlevel setzt, bekommst du ohne "ELSE IF" das komplette Chaos, weil dann ja ab der nächsten Abfrage nicht mehr der Errorlevel des CHOICE, sondern der des anderen Befehls abgefragt wird. Mit einem GOTO in jeder Abfrage kannst du das natürlich verhindern, aber das empfehle ich jetzt mal ausdrücklich nicht.

Gruß vom
WinCobold