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?
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. .
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. .
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1688925138
Url: https://administrator.de/contentid/1688925138
Ausgedruckt am: 22.11.2024 um 14:11 Uhr
4 Kommentare
Neuester Kommentar
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
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? BTW Selbst wenn du mit der %ERRORLEVEL% Variable arbeitest, ist ELSE IF semantisch immer noch sinnvoller. Egal.
Steffen
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
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