Batch goto errorlevel fail

Rastalocke

Cadet 3rd Year
Dabei seit
Nov. 2010
Beiträge
57
Hey Leute,
Ich habe ein kleines Langeweileoprojekt in der Mache.
Ich will eine kleine Pseudo-Kommandozeile programmieren.
Zur Befehlseingabe benutze ich den goto Befehl:
set /p set1="<0>"
goto %set1%
if errorlevel 1 goto set1fail

Alle verfügbaren Befehle sind als Sprungmarken im Script.

Jetzt das Problem: wenn ich einen unbekannten Befehl eingebe sollte ja theoretisch die if - Sicherung anspringen. allerdings meldet es mir sprungmarke nicht gefunden beendet sofort das ganze script.

Wo liegt der Fehler?
 
1

1668mib

Gast
Naja da bleibt wohl nur zu prüfen, ob es ne gültige Sprungmarke ist... zudem ist es sowieso krass, die Sprungmarken direkt ungeprüft aus der Eingabe zu verwenden...
 

frogger9

Commodore
Dabei seit
Feb. 2008
Beiträge
4.267
If Anweisungen müssen vor dem Goto stehen.

Richtig wäre zB.

Code:
:Input
set /p set1="Press 1"
If "%set1%"=="1" (goto Next) Else Goto Input

:Next
 

lynxx

Lt. Junior Grade
Dabei seit
Feb. 2005
Beiträge
427
Kann man recht einfach prüfen:

Code:
@echo off
set /p set1="<0>"
findstr /n /b /i /c:":%set1%" "%~f0" >NUL
if errorlevel 1 goto set1fail
goto %set1%

:com1
echo Executing Command1
goto EOF

:com2
echo Executing Command2
goto EOF

:set1fail
echo Command "%set1%" not found !

:EOF
 

Rastalocke

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
57
thanks Lynxx! sorry bin eher ein noob mit cmd hab das nähmlich nich in der schule gelernt sondern mir selbst mehr oder weniger beigebracht
 

Yuuri

Fleet Admiral
Dabei seit
Okt. 2010
Beiträge
13.793
Zitat von lynxx:
Aber aufpassen, if errorlevel x prüft ob errorlevel >= x ist, nicht ==. Wenn man also korrekt auf ein Errorlevel prüfen will, dann ist if errorlevel 1 if not errorlevel 2 korrekt. Bringt sonst böse Seiteneffekte zustande. Bzw. würde ein if errorlevel EQ 1 auch funktionieren.
 
1

1668mib

Gast
Dann gib als Kommando mal "c" oder "co" oder "com" ein, dann gauch das von lynxx gepostete nicht..

Die Lösung könnte etwa so aussehen:
Code:
@echo off
set /p set1="<0>"
findstr /n /b /i /c:"^:%set1%$" "%~f0" >NUL
if errorlevel 1 goto set1fail
goto %set1%Mark

:com1
echo Executing Command1
goto EOF

:com2
echo Executing Command2
goto EOF

:set1fail
echo Command "%set1%" not found !

:EOF

@Yuuri:
Zitat von http://ss64.com/nt/findstr.html:
When an item is not found FINDSTR will return an errorlevel >0
So viel zum Thema Seiteneffekte... wenn auf der Seite kein Unsinn steht, dann ist die Abfrage genau so richtig...

Alternative wäre wie auf der Seite gezeigt auf EQU 0 prüfen und dann den GOTO zur Marke zu machen und sonst die Fehlerbehandlung durchführen...
 
Zuletzt bearbeitet:
Top