Programmierfehler?
Hallo zusammen,
ich habe leider ein Problem bei einer Batch-Datei.
Ich programmiere selber Batch, kann aber dieses Problem nicht lösen.
Es handelt sich um diesen Code:
@echo off
color f0
title Leon's IP scanner -By Kein Zugriff
:menu
cls
echo.
echo.
echo 1) Scan IP's
echo 2) Shutdown PC
echo 3) Be cool
echo 4) Quit
set /p input="1 , 2 , 3 or 4 : "
if %input% == 1 (
cls
echo Scanning IP's in you're near...
timeout 3 > NUL: /NOBREAK
echo.
echo IP's found! (or not)
timeout 2 > NUL: /NOBREAK
arp -a
echo press any key to continue...
pause > NUL: /NOBREAK
goto menu
)
if %input% == 2 (
cls
echo PC Shutsdown...
Shutdown -s -t 100
exit
)
if %input% == 3 (
cls
goto cool
)
if %input% == 4 (
exit
)
:cool
color 0a
cls
goto spam
:spam
echo Cool!
timeout 1 > NUL:
goto spam
Ich brauche eine Antwort. Danke. :)
3 Antworten
Kannst Du Dein Problem nicht beschreiben? 😅
so in der Art: "Egal welchen Menüpunkt ich wähle, es wird "arp" ausgeführt und zurück zum Menü gesprungen"
Tja das kommt davbon, das Du eine der schlimmsten "Programmiersprachen" für Dein Projektchen gewählt hast und deren Regeln und vor allem Tücken nicht beherrscht. (nicht traurig sein, an Batch scheitern sogar altgediente Profis) .
wo liegt Dein Problem...
Klammern!!! 🥵🥵🥵🥵Batch kann nicht zwischen funktionalen Klammer und Klammern im Text unterscheiden!
in einem normalen
echo das ist ein Text (mit Klammern) .
...absolut kein Problem. ...aber:
if 5 equ 3 ( echo Das gibt einen (fetten) Syntaxfehler)
weil der Parser die erste schleißende Klammer, welche zum Text gehört als Abschluss des Funktionsblocks sieht und mit dem "danach" nicht anzufangen weiß.
Das bei Dir kein Syntaxfehler ausgelöst wird, ist einfach der gückliche Umstand, das nach echo IP's found! (or not) kein weiteres Zeichen in dieser Zeile folgt und vor der nun "nackten" schließenden Klammer am ende weggesprungen wird (der parser diese nie zu sehen bekommt!)
if 3 equ 3 (
echo irgendwas (die folgende Klammer wird als Abschluss des funktionsblocks gesehen und nie angezeigt. die hier: )
echo diese Zeile liegt somit außerhalb des if-Funktionsblocks
echo und wird immer ausgeführt egal ob "if" wahr oder falsch ist
goto :raus
) diese Klammer/Zeile bekommet der Parser nie zu Gesicht , deshab macht die nackte Klammer keinen Ärger
:raus
echo fertig
pause
die lösung ist einfach:
Text-Klammern innerhalb von funktionalen Klammern mit mit einem ^Carret maskieren.
if 5 equ 3 (
echo so ist es richtig ^( Klammern maskiert^)
echo diese zeile liegt nun innerhalb des Funktionsblocks und wür nur ausgeführt wenn 3 gleich 3 ist
)
Bei der Gelegenheit habe ich noch einigen anderen Müll gefixt.
Bei eingaben via set/p kann ein Nutzer auch eingaben Tätigen für die Du kein Option vorgesehen hast was zu sehr unvorhersebaren Fehlern führen kann. Nutze besser choice.
- timeout 3 > NUL: /NOBREAK , ist Käse >nul leitet eine Ausgabe ins Nirvana um das /nobreak interessiert den Parser nicht mehr richtig rum timeout 3 /nobreak >nul https://ss64.com/nt/timeout.html
- arp /a zeigt den arp-Cache und nicht die IPs in der Nähe! https://www.geeksforgeeks.org/how-address-resolution-protocol-arp-works/
- für Leerzeilenausgabe nicht echo. (kann zu kritischen Nebeneffekten führen) sondern echo:
nach der Kritik das gefixte Script:
demo.cmd
@echo off
color f0
title Leon's IP scanner -By Kein Zugriff
:menu
cls
echo:
echo:
echo 1) Scan IP's
echo 2) Shutdown PC
echo 3) Be cool
echo 4) Quit
choice /c 1234 &rem nutze choise , das verhindert unerwünschte Eingaben durch den Nutzer
if %Errorlevel% equ 1 (
cls
echo Scanning IP's in you're near...
timeout 3 /nobreak >nul &rem so herum
echo:
echo IP's found! ^(or not^)
timeout 2 /nobreak >nul
arp -a &rem quatsch! gibt larp-cache aus und scannt nicht die IPadressen in der Nähe
echo press any key to continue...
pause >nul
goto menu
)
if %Errorlevel% equ 2 (
cls
echo PC Shutsdown...
Shutdown -s -t 100
exit /b
)
if %Errorlevel% equ 3 (goto :cool)
if %Errorlevel% equ 4 (exit /b)
:cool
cls
color 0a
rem das goto :spam an dieser Stelle erübrigt sich, weil das Sprungziel ohnehin die nächste Zeile wäre!
:spam
echo Cool!
timeout 1 /nobreak >nul
goto spam
Kleiner Tipp am Rande. Lerne lieber Powershell. Das hat nicht all die fiesen Fallstricke welche Batch hat.
Und bitte lass die ganzen Apostrophe weg:
echo Scanning IP's in you're near...
heißt auf Deutsch etwa
echo frage des Internetprotokolls in du bist nah ab...
Vielleicht liegt Dein Problem darin begründet, daß da kein @echo off vorkommt.
Edit: Ach nee, das gehört schon zum Code. Tipp: Wenn Du den Code als Quelltext einfügst, wird das gleich ersichtlich. Dazu auf die drei Punkte oben rechts und dann das zweite Symbol von rechts "</>" - "Quelltext" auswählen.
Super hilfreich wäre es natürlich, wenn Du beschreibst, was denn nun das Problem ist.
Da ich gerade kein Windoof habe, kann ich das Skript nicht testen.
Aber falls es jemand tut: nachdem die 3 gedrückt wurde, kann das Skript mit STRG+C abgebrochen werden ;-)
Worin liegt denn das Problem?
Batch kann immer per Strg-C abgebrochen werden.
/nobreak ist ein Parameter von timeout, welcher lediglich mehrfach falsch platziert wurde (nach >nul macht der absolut nix.
/Nobreak hat nichts mit dem Abbruch der Batch zu tun
Allerdings sind unmaskierte Text-Klammern innerhalb eines Klammerblocks in diesem Glücksfall (kein sofortiger Syntaxfehler) etwas was selbst Fachleute zur Verzweiflung bringen kann, Optisch sieht das total in Ordnung aus.
für den parser liegen:
timeout 2 /nobreak >nul
arp -a
echo press any key to continue...
pause >nul
goto menu
nicht im if-Block und werden immer ausgeführt , egal was man eingibt.
Dankeschön, sehr hilfreich.