Willkommen in der verrückten Welt der Batchprogrammierer🥴🤪😬😜
Das erste Zeichen eines Variablenname darf nie eine Ziffer sein!
%Ziffer (%1 , %2 usw) repräsentiert einen an die Batch / Subroutine übergebenen Parameter.
call :mySub wuff
pause
exit /b
:mysub
echo %1
set 1a=blub
rem wurde die variable gesetzt? (ja) ...mal anzeigen...
set 1a
rem kannst Du darauf zugreifen? (nein)
echo %1a%
Du kannst zwar eine solche Variable setzen, aber nicht darauf zugreifen.
wenn es unumgänglich ist dann so:
set "__1Variable=gdsb"
noch mehr Fallstricke:
Setze den Term von set,set /p,set /a möglichst immer in "Gänsefüßchen".
set /p "menuchoice="
set "myVar=Blah & Blubb"
set /a "MyMumber=2+3"
Setze Variablenabrufe möglichst immer in "Gänsefüßchen"
if "%menuchoice%"=="1" goto S1
...sollte eine Variable die Zeichen &|<> enthalten, (weil der Nutzer zB diese eingegeben hat) stürzt die Batch gnadenlos ab!
falsch:
set "boeseVariable=blah&blubb"
if %boeseVariable%==irgendwas echo iwas
pause
richtig:
set "boeseVariable=blah&blubb"
if "%boeseVariable%"=="irgendwas" echo iwas
pause
Auch wenn es erlaubt ist meide in Variablennamen alle Zeichen außer Buchstaben,Zahlen und _ []{}.
+-*/~? in Variablen könnnen beim Rechnen und Stringverarbeitung zu Fehlern führen:
blöd:
set "eine-Zahl=7"
set /a "Ergebnis=eine-Zahl + 3"
echo %ergebnis%
richtig:
set "eine_Zahl=7"
set /a "Ergebnis=eine_Zahl + 3"
echo %ergebnis%
verwende nie Leerzeichen in Labeln goto wertet nur bis zum Auftreten eines Leerzeichens aus. https://ss64.com/nt/goto.html
goto :ein label
blubb
:ein
echo Label: ein
pause
:ein label
echo label: ein label
pause
...das gibt Missverständnisse...🤮 Ziffern am Beginn von Labelnamen sind zwar erlaubt, aber verpönt. Verwende statt Leerzeichen underline_ oder CamelCase ( :ein_Label oder :einCamelCaseLabel)
Tipp:
für Auswahlmenüs verwende choice. Dies erlaubt nur die Eingabe der vorgegebenen Auswahlmöglichkeiten.
@echo off
rem Umlaute anzeigen
chcp 65001 >nul
echo Menü:
echo 1: einwas
echo 2: was anderes
echo x: Hüpf auf einem Bein ^| o: sag O
choice /c 12xo /m "Was darf es sein:"
if %errorlevel% equ 1 (echo einwas wird gemacht)
if %errorlevel% equ 2 (echo was andres wird gemacht)
if %errorlevel% equ 3 (echo Hüpf...hüpf)
if %errorlevel% equ 4 (echo o.O)
pause
- https://ss64.com/nt/choice.html
- https://ss64.com/nt/chcp.html