Programmierfehler?

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.

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

derbobeta 
Beitragsersteller
 27.08.2024, 17:34

Dankeschön, sehr hilfreich.

ralphdieter  27.08.2024, 23:29
@derbobeta

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?


Erzesel  27.08.2024, 16:15

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.