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.