Batch CMD If Befehl?
:sortclass0
set count=0
:sortclass1
set /a count0=%count0%+1
if var%count1%==x set /a ergebnis=y
if %count1% GEQ %maxvar% goto sortclass2
goto sortclass1
Hallo, mein Problem:
Ich habe eine Reihe an variablen var1, var2, var3 ... und will alle nach einem bestimmten Wert absuchen allerdings erkennt das if "var%count1%" nicht als eine Variable an wie kann ich die kombination von "var" mit einer variablen zahl als variable in "if" nutzen?
3 Antworten
Batch kennt normalerweise keine verschachtelten Variablenamen.
für die Konstruktion von Variablenamen und deren Auswertung gibt es mehere Möglichkeiten
@echo off
setlocal enableDelayedExpansion
set "var1=blubb"
set "var2=blah"
set "var3=muh"
set "var4=meff"
set "var5=rumpel"
set "var6=erna"
set "VarMax=6"
:loop
set /a "count+=1"
if "!Var%count%!"=="muh" echo "%compareVar%" ist gleich "muh"
if %count% leq %VarMax% goto :loop
:raus
pause
oder die erweiterte Nutzung von call
Da man aber call nicht mit einem if-Statement verwenden kann, kommt man nicht drumherum für einen vergleich den inhalt in eine einfache variable zu kopieren und diese zu vergleichen.
@echo off
set "var1=blubb"
set "var2=blah"
set "var3=muh"
set "var4=meff"
set "var5=rumpel"
set "var6=erna"
set "VarMax=6"
:loop
set /a "count+=1"
call set "compareVar=%%var%count%%%"
if "%compareVar%"=="muh" echo "%compareVar%" ist gleich "muh"
if %count% leq %VarMax% goto :loop
:raus
echo fertig
pause
Ich weiß nicht was Du Dir da vorgenommen hast. Wenn Du nicht gerade spaß an hirnrissig komplexexen Batchspielerein hast such Dir eine bessere Sprache... zB Powershell
das gleiche in Powershell:
'blubb','blah','muh','meff','rumpel','erna'|
ForEach-Object{
if ($_ -eq 'muh') {
'"{0}" ist gleich "muh"'-f $_
}
}
versuche es mal mit dem folgenden code: set count=0 set maxvar=3 set "var1=foo" set "var2=bar" set "var3=baz" :sortclass1 set /a "count+=1" if not defined var%count% goto sortclass0 if %count% GTR %maxvar% goto sortclass2 if "var%count%"=="wert" set "ergebnis=y" goto sortclass1 Dieser Code durchsucht variable var1, var2 und var3 nach einem bestimmten Wert und setzt eine variable auf "y", wenn der Wert gefunden wird. Du musst nur den Wert anpassen, nach dem du suchen möchtest
funktioniert mit dem Anführungszeichen leider auch nicht if "var%count%"=="wert" set "ergebnis=y"
Für Variablen innerhalb von Variablen benötigst du "setlocal enabledelayedexpansion" in Kombination mit Variablen in Ausrufezeichen zusätzlich zu den Variablen in Prozentzeichen.
Hier ein einfaches Beispiel:
setlocal enabledelayedexpansion
@echo off
cls
set i=0
:start
set Var1=abc
set Var2=def
set Var3=ghi
set /A i+=1
set Var=!Var%i%!
echo %Var%
if %i% lss 3 goto start
rem Ausgabe:
rem
rem abc
rem def
rem ghi
pause
Hat'er schon gemacht...
Die Nummer mit dem call umgeht Probleme mit möglichen Variableninhalten, due Ausrufezeichen enthalten könnten.
Als verzögerte Expansion zu Batch hinzugefügt wurde muss es den Entwicklern wohl entgangen sein (denen wird LSD-Missbrach nachgesagt), das in eingelesen Text (oder Dateinamen) auch Ausrufezeichen möglich sind, allerdings werden diese entfernt oder noch schlimmer: der auf ein Ausrufezeichen folgende Text wird als leere Variable angesehen. 🤮😱Und zu nichts aufgelöst.
Wenn man nicht weiß was in eine Variable eingelesen wird, verzichtet man besser auf DelayedExpansion.
Das ein-/aus-schalten von DelayedExpansion während des Programmflusses ist tückisch, da jeder Aufruf von setlocal ein neues Set von Environvariablenkopien erzeugt , dies aber nur max 32mal. Ein endlocal oder exit /b verwirft alle Änderungen und kehrt zum vorherigen Set zurück... Das schützt zwar den "Stapel" von Variablenkopien vor dem überlaufen, aber vergisst alles was mal war....
Batch ist absolut nichts für schwache Nerven...🥴🤕🤤🥳
@Erzesel könnte dir auch noch eine Variante ohne "setlocal enabledelayedexpansion" aufzeigen, bei der die Variablen etwas unübersichtlicher ineinander verschachtelt sind und auf eine CALL-Konstruktion angewiesen sind... das würde hier aber nach meinem Gefühl den Rahmen etwas sprengen.