Code funktioniert nicht Bat?

2 Antworten

Es funktioniert nun Vielen Dank!

naja... aber toll ineffizient

Da ist jemand über die Steuerzeichen von Batch gestolpert.

Batch ist nunmal keinen Sprache zum flexen, die wurde entwickelt um Adminaufgaben zu automatisieren. als die entwickelt wurd, konnte keienr Ahnen das Leute dmit Spaß haben wollen...

Daran liegt's:

In Batch haben die Zeichen |&<> ^ % " und bei delayedExpansion auch ! eine Steuerfunktion.

  • Die Redirection-Symbole <> dienen zur Umleitung eines Textes aus/in Dateien
  • Das Pipe-symbol | reicht die Ausgabe eiens Befehls an einen anderen Befehl weiter.
  • & dient zum Aneinanderreihen mehrerer Befehle in einer Zeile
  • ^ maskiert (escaped) obige Zeichen als Textzeichen
  • %var% %%x und !var! kennzeichnen Variablen

obige können ohne spezielle Maßnahmen (maskieren) nicht mit Echo ausgegeben werden.

  • " " kennzeichnet das was dazwischen steht als normalen String

Folgendes bringt eine Batch zum Absturz , weil diese Zeichen Unsinnige Aktionen auslösen (massiver Syntaxfehler)

echo | <> & blah und blub
">" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
Die Lösungen sind in jedem Fall verzwickt:

Dies kann man verhindern indem man den Text in Quotes setzt.

echo " | <> & blah und blub"

...dann werden aber die "Quotes" mit ausgegeben.🤮

...oder man maskiert jedes dieser Zeichen einzeln:

echo ^| ^<^> ^&  ^^ blah und blub

Bei einzelnen Zeichen hinundwieder ist das ok, aber... viel Spaß bei einem Textlogo 🥵

 rem über einen for/f-Schleife in eien Laufvariable zu übergeben und diese im Schleifenrumpf an echo zu übergeben (Laufvariablen werden erst mit dem Befehl aufgelöst)
 for /f "delims=" %%a in ("ich bin ein Text mit | <> & ^ %% blubb") do (echo %%a)

...ein Haufen Schreibkram für eine Zeile, aber diese Lösung habe ich nicht umsonst gebracht, denn diese Schleife kann auch aus Text Dateien lesen und die Batch ist auch nur eine Textdatei.

In der folgenden Batch habe ich einfach mehrere Logos mit ::::begin logoname.logo und ::::End.logo:::: markiert und an das Ende der Batch angehängt so kann eine kleine Subroutine (:DrawASCIILogo) die Logos am Ende der Datei finden und ausgeben. Im Hauptbereich der Batch wird das gesamte Logo mit eineem Befehl call :DrawASCIILogo "logoname.logo" abgerufen. Keine Einzelnen echo-aufrufe mehr schreiben (einfach Einfügen wie sie der Logogenerator) liefert.

Mehr Effizienz kann man nicht erwarten... und der Laufvariable sind die Sonderzeichen völlig egal.

@echo off
chcp 65001 >nul &rem Umlaute richtig anzeigen

 rem rufe Subroutine auf , welche das Logo zeichent...
:menu
cls
call :DrawASCIILogo "Erzesel.Flower"
echo --------------
echo [G]otisch
echo [R]adioaktiv
echo [A]ufhören
echo --------------
 rem statt set/p besser fur Menüs "choice" verwenden, damit kann der nutzer nur die definierten Buchstaben/Zahlen auswählen !!!
choice /c GRA
if %errorlevel% equ 1 (
  echo:
  call :DrawASCIILogo "Erzesel.Gotic"
   rem darum darf auch kein nacktes & im echo stehen dahinter kommt ein Befehl...
  echo mit beliebiger Taste zurück zum Menü & pause>nul
  goto :menu
)
if %errorlevel% equ 2 (
  call :wasAnderes
  goto :menu
) else (
   rem für die letzte Option muß kein if definiert werden 
  echo ...und Tschüß!!
  timeout 3 >nul
  exit /b
)

exit /b  %=dises exit ist nur zur Sicherheit eigentlich springen alle Entscheidunen vorher weg=%
::hier ist der Hauptteil der Batch garrantiert zu Ende

 :::::: subroutine/bn :::::
:wasAnderes
echo:
 rem dreimal Beeb wärend die Batch weitermacht Missbrauch von choice damit du mal siehst wofür Steuerzeichen gut sind
start "" /b cmd /c "echo aaax|choice /c x>nul"
call :DrawASCIILogo "Radiation"
timeout 5 >nul
exit /b

:DrawASCIILogo
 rem finde die Anfangszeile des Bildes in dieser Batch
set "toSkip="
set "beginMark=::::Begin %~1.logo"
set "endMark=::::End.logo::::"
for /f "skip=2 tokens=1 delims=[]" %%a in ('find /n "%beginMark%" "%~f0"') do (set "toSkip=%%a")
if not defined toSkip (
  echo LogoMarker: "%beginMark%" nicht gefunden!
  exit /b 1
)
for /f "usebackq skip=%toSkip% tokens=* delims=" %%t in ("%~f0") do (
  if /i "%%~t"=="%endMark%" exit /b 0
  echo %%t
)
exit /b

Das was hier kommt gehört Quasi nicht mehr zur Batch. Hinter ein "exit /b" kommt der Interpreter nich ohne ein Goto oder Call 

::Logo(s) nach folgendem Muster kennzeichen:
::::Begin Erzesel.Flower.logo
  .-''-. .-------.   ____..--'  .-''-.   .-'''-.   .-''-.  .---.   
 .'_ _  \ | _ _  \  |    | .'_ _  \  / _   \ .'_ _  \  | ,_|   
 / ( ` )  '| ( ' ) |  |  .-' ' / ( ` )  ' (`' )/`--' / ( ` )  ',-./ )   
. (_ o _) ||(_ o _) /  |.-'.'  /. (_ o _) |(_ o _).  . (_ o _) |\ '_ '`)  
| (_,_)___|| (_,_).' __   /  _/ | (_,_)___| (_,_). '. | (_,_)___| > (_) )  
' \  .---.| |\ \ | | .'._( )_ ' \  .---..---. \ :' \  .---.( . .-'  
 \ `-'  /| | \ `'  /.' (_'o._) \ `-'  /\  `-' | \ `-'  / `-'`-'|___ 
 \    / | | \  / |  (_,_)| \    / \    /  \    /  |    \
  `'-..-' ''-'  `'-' |_________|  `'-..-'  `-...-'   `'-..-'  `--------`
::::End.logo::::

::::Begin Radiation.logo
           X XXXXXXXXXXXXX X
        X     XXXXXXXXXXX     X
      X        XXXXXXXXX        X
     X          XXXXXXX          X
    X            XXXXX            X
   X              XXX              X
   X               X               X
   XXXXXXXXXXXXXXX   XXXXXXXXXXXXXXX
    XXXXXXXXXXXXX     XXXXXXXXXXXXX
     XXXXXXXXXXX       XXXXXXXXXXX
      XXXXXXXXX         XXXXXXXXX
        XXXXXX           XXXXXX
          XXX             XXX
              X         X
                   X
::::End.logo::::

::::Begin Erzesel.Gotic.logo


 ,- _~,               ,, 
 (' /| /               || 
(( ||/= ,._-_ /\\ _-_  _-_, _-_ || 
(( ||  ||  / || \\ ||_. || \\ || 
 ( / |  ||  /\\ ||/  ~ || ||/  || 
 -____- \\,  || \\,/ ,-_- \\,/ \\ ipsum dolor sit ametsed cupiditat,
        /            consectetur adipisici elit,
in culpa qui  (, officia usmod tempor incidunt ut labore et dolore magna.
 Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquid ex ea commodi consequat.
 Quis aute iure reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint obcaecat non proident, 
sunt deserunt mollit anim id est laborum.
::::End.logo::::

wenn du richtig flexen willst , musst du schon etwas tiefer in die Kiste greifen....

https://www.gutefrage.net/home/thema/batch-trick/neue

oder so ein logo:

Bild zum Beitrag

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
 - (programmieren, cmd, Batch-Datei)

Versuch das Script mal in der Konsole zu starten, und schau dann was dir als Fehlermeldung rausgegeben wird.

Wahrscheinlich ist der Fehler hier:

else if %Eingabe%==2 (
)

Da es zwischen den Klammer leer ist.

Bambussocke 
Fragesteller
 19.10.2021, 18:32

Nein, daran lag es nicht, ich habe gerade alles ab set /p Eingabe="Eingabe: " bis pause >NUL gelöscht und es ging trotzdem nicht...

0
L4ze3  19.10.2021, 18:33
@Bambussocke

Dann führ das script mal in cmd aus. Dann verhinderst du, dass sich das Fenster schließt

0
Bambussocke 
Fragesteller
 19.10.2021, 18:43
@L4ze3

---------------------------------------------

 _____       _  _      _

"|" kann syntaktisch an dieser Stelle nicht verarbeitet werden.

also Wenn ich es richtige sehe, muss ich die große schrift oben entfernen da es "|" nicht war nehmen kann?

0
L4ze3  19.10.2021, 18:45
@Bambussocke

Dann musst du Anführungszeichen dran machen. Bsp:

echo "-----------"
0
Bambussocke 
Fragesteller
 19.10.2021, 18:48
@L4ze3

Vielen Dank dir :) Nun hat es endlich geklappt !

1