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.

0
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...
0

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.

1