Batch Syntaxfehler, aber finde ihn nicht :(
Hi, ich wollte mir mal in Batch ein kleines Menü schreiben um all meine Kleineren Scripte dort einbinden zu können. nun wollte ich das Via "choice" machen aber ich bekomme immer die Fehlermeldung "Syntaxfehler". Diese bekomme ich aber nur wenn ich via CMD in das Verzeichnis navigiere in dem die Datei ist, sie starte und dann eine der vorgegebenen eingaben mache, da sich wenn ich das Script normal starte es sich sofort nach der Eingabe wieder schließt. Das Script: (habe bisher nur die Navigation durch die verschiedenen Punkte gescriptet)
wenn ich die Ganzen befehle die Hinter den If's ausgeführt werden mit && verknüpfe kommt auch eine Fehlermeldung : && kann an dieser stelle nicht ausgeführt werden...
Kann mir bitte jemand Helfen und auch ERKLÄREN wo mein Fehler lag damit ich daraus lerne?
Die einzelnen zeilen "REM --------------------------------" hab ich mal nur der übersichtlichkeit für mich selbst eingefügt
@echo off
:Menu
cls
echo -----------------------------
echo %m1%Auswahl 1
echo %m2%Auswahl 2
echo %m3%Auswahl 3
echo %m4%Auswahl 4
echo -----------------------------
:Choice
choice /C:SWC
if errorlevel 255 goto Menu
if errorlevel 3 goto Wählen
if errorlevel 2 goto Hoch
if errorlevel 1 goto Runter
if errorlevel 0 goto Menu
:Wählen
if "%m1%"==">>" goto auswahl1
if "%m3%"==">>" goto Auswahl2
if "%m1%"==">>" goto auswahl3
if "%m3%"==">>" goto Auswahl4
:Runter
REM ---------------------
if "%m1%"==">>"(
set m1=
set m2=>>
goto Menu
)
REM ---------------------
if "%m2%"==">>"(
set m2=
set m3=>>
goto Menu
)
REM ---------------------
if "%m3%"==">>"(
set m3=
set m4=>>
goto Menu
)
REM ---------------------
if "%m4%"==">>" goto Menu
:Hoch
REM ---------------------
if "%m4%"==">>"(
set m4=
set m3=>>
goto Menu
)
REM ---------------------
if "%m3%"==">>"(
set m3=
set m2=>>
goto Menu
)
REM ---------------------
if "%m2%"==">>"(
set m2=
set m1=>>
goto Menu
)
REM ---------------------
if "%m1%"==">>" goto Menu
pause
wenn ich die Ganzen befehle die Hinter den If's ausgeführt werden mit && verknüpfe kommt auch eine Fehlermeldung : && kann an dieser stelle nicht ausgeführt werden...
Kann mir bitte jemand Helfen und auch ERKLÄREN wo mein Fehler lag damit ich daraus lerne?
Die einzelnen zeilen "REM --------------------------------" hab ich mal nur der übersichtlichkeit für mich selbst eingefügt
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 329233
Url: https://administrator.de/contentid/329233
Ausgedruckt am: 26.11.2024 um 16:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo PinkFLuffyUnicorn
ECHO OFF und CLS schmeißt du raus, wenn du einen Fehler nicht finden kannst, dann wird's einfacher.
1.) Keine deiner m... Variablen ist initialisiert.
2.) Umlaute in einem Batchcode kannst du gleich vergessen.
3.) Im Label :Wählen (da ist der Umlaut) gibt's nur %m1% und %m3%
4.) Du machst dir das Leben selber schwer, indem du >> verwendest. Die > haben einen Sonderstatus in Batch und dienen der Dateiumleitung. Wenn, musst du sie entsprechend maskieren. Damit die Maskierung auch in der Variable landet, muss die SET Zuweisung in Anführungszeichen stehen.
5.) Bei allen mehrzeiligen IF Anweisungen fehlt das Leerzeichen vor der öffnenden Klammer
6.) Keine der Label Auswahl1 - Auswahl4 existiert in deinem Code.
Gewöhn dir möglichst bald ab, elfundneuzig GOTOs in deinem Code zu haben. In anderen Sprachen gibt's das aus gutem Grund nicht mal. In Batch brauchst du das lediglich für do-while Schleifenvarianten, die dort nicht zum Sprachumfang gehören.
Grüße
rubberman
ECHO OFF und CLS schmeißt du raus, wenn du einen Fehler nicht finden kannst, dann wird's einfacher.
1.) Keine deiner m... Variablen ist initialisiert.
2.) Umlaute in einem Batchcode kannst du gleich vergessen.
3.) Im Label :Wählen (da ist der Umlaut) gibt's nur %m1% und %m3%
4.) Du machst dir das Leben selber schwer, indem du >> verwendest. Die > haben einen Sonderstatus in Batch und dienen der Dateiumleitung. Wenn, musst du sie entsprechend maskieren. Damit die Maskierung auch in der Variable landet, muss die SET Zuweisung in Anführungszeichen stehen.
5.) Bei allen mehrzeiligen IF Anweisungen fehlt das Leerzeichen vor der öffnenden Klammer
6.) Keine der Label Auswahl1 - Auswahl4 existiert in deinem Code.
@echo off
set "m1=^>^>"
for /l %%i in (2 1 4) do set "m%%i= "
:Menu
cls
echo -----------------------------
echo %m1%Auswahl 1
echo %m2%Auswahl 2
echo %m3%Auswahl 3
echo %m4%Auswahl 4
echo -----------------------------
:Choice
choice /C:SWC
if errorlevel 3 goto Waehlen
if errorlevel 2 goto Hoch
if errorlevel 1 goto Runter
goto Menu
:Waehlen
if "%m1%"=="^>^>" goto Auswahl1
if "%m2%"=="^>^>" goto Auswahl2
if "%m3%"=="^>^>" goto Auswahl3
if "%m4%"=="^>^>" goto Auswahl4
:Runter
REM ---------------------
if "%m1%"=="^>^>" (
set "m1= "
set "m2=^>^>"
goto Menu
)
REM ---------------------
if "%m2%"=="^>^>" (
set "m2= "
set "m3=^>^>"
goto Menu
)
REM ---------------------
if "%m3%"=="^>^>" (
set "m3= "
set "m4=^>^>"
goto Menu
)
REM ---------------------
if "%m4%"=="^>^>" goto Menu
:Hoch
REM ---------------------
if "%m4%"=="^>^>" (
set "m4= "
set "m3=^>^>"
goto Menu
)
REM ---------------------
if "%m3%"=="^>^>" (
set "m3= "
set "m2=^>^>"
goto Menu
)
REM ---------------------
if "%m2%"=="^>^>" (
set "m2= "
set "m1=^>^>"
goto Menu
)
REM ---------------------
if "%m1%"=="^>^>" goto Menu
:Auswahl1
echo Auswahl1
pause
goto :eof
:Auswahl2
echo Auswahl2
pause
goto :eof
:Auswahl3
echo Auswahl3
pause
goto :eof
:Auswahl4
echo Auswahl4
pause
goto :eof
Gewöhn dir möglichst bald ab, elfundneuzig GOTOs in deinem Code zu haben. In anderen Sprachen gibt's das aus gutem Grund nicht mal. In Batch brauchst du das lediglich für do-while Schleifenvarianten, die dort nicht zum Sprachumfang gehören.
Grüße
rubberman
zu welchem punkt im Script springt eigentlich goto :eof?
Zu jedem Befehl lässt sich die Hilfe per
Befehl /?
aufrufen.goto /? :
...
Der GOTO-Befehl unterstützt jetzt die Marke :EOF. Dadurch wird die Bearbeitung
am Ende der aktuellen Batchdatei fortgesetzt. Das ist eine einfache
Möglichkeit, eine Batchdatei zu beenden, ohne ein Sprungziel zu definieren.
...
Grüße
rubberman
Zu deinem "Edit":
Ich lösche die Variablen nicht, sondern definiere sie mit 2 Leerzeichen, um den Abstand in deinem Menü zu halten. Die Anführungszeichen sind in 99% der Fälle hilfreich. Sie schützen dich davor, dass sich ggf. noch ein Leerzeichen am Ende der Zeile einmogelt und es ist eine einfache Möglichkeit Sonderzeichen wie <>|&^ ohne Nebenwirkungen in den Variablenwert zu bekommen.
Grüße
rubberman
Ich lösche die Variablen nicht, sondern definiere sie mit 2 Leerzeichen, um den Abstand in deinem Menü zu halten. Die Anführungszeichen sind in 99% der Fälle hilfreich. Sie schützen dich davor, dass sich ggf. noch ein Leerzeichen am Ende der Zeile einmogelt und es ist eine einfache Möglichkeit Sonderzeichen wie <>|&^ ohne Nebenwirkungen in den Variablenwert zu bekommen.
Grüße
rubberman