pinkfluffyunicorn
Goto Top

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)

@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

Content-Key: 329233

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

Printed on: April 26, 2024 at 19:04 o'clock

Member: rubberman
rubberman Feb 12, 2017 at 12:20:27 (UTC)
Goto Top
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.
@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
Member: PinkFLuffyUnicorn
PinkFLuffyUnicorn Feb 12, 2017 updated at 12:48:08 (UTC)
Goto Top
das mit dem Sonderstatus hab ich mir schon irgendwie gedacht, aber jetzt weis ich wenigstens auch wie ich solche Sonderzeichen als Variable setzen kann. die Label "Auswahl" 1-4 haben keine Funktion da ich soweit noch Nichtmal gekommen bin, was aber für den teil des Scriptes ja eigentlich kein Problem sein sollte. ich habe das extra nochmal ge-Googelt mit den If Anweisungen und den Klammern, und da war es auch ohne Leerzeichen zwischen beiden, was mir schon komisch vorkam. und ja ich weis, ich sollte weniger goto's benutzen... :D

zu welchem punkt im Script springt eigentlich goto :eof?

und danke für deine schnelle Antwort^^

Edit: habe grade gesehen, dass du auch "set m2= " in Anführungszeichen gesetzt hast, habe das extra nochmal in einem anderen Thread auf der Seite (nicht von mir überprüft, und dort hat Bastla es ohne Anführungszeichen gemacht, und laut dem Fragesteller hat es funktioniert. hat das einen besonderen Grund auch die Löschung der Variable in Anführungszeichen zu setzen? ich gehe mal davon aus dass es Unklarheiten bei dern Setzung des variablen wertes vorbeugt?!
Member: rubberman
Solution rubberman Feb 12, 2017 at 12:55:43 (UTC)
Goto Top
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.
...
:eof ist also ein virtuelles Label (das nirgends im Code zu finden ist) und steht für End Of File.

Grüße
rubberman
Member: PinkFLuffyUnicorn
PinkFLuffyUnicorn Feb 12, 2017 at 13:18:09 (UTC)
Goto Top
okay danke!^^
Member: rubberman
Solution rubberman Feb 12, 2017 at 13:23:07 (UTC)
Goto Top
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