Batch CMD If Befehl?

3 Antworten

Batch kennt normalerweise keine verschachtelten Variablenamen.

für die Konstruktion von Variablenamen und deren Auswertung gibt es mehere Möglichkeiten

Verzögerte VariablenExpansion

@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 $_
       }
    }
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

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

Frameworks 
Fragesteller
 07.03.2023, 11:29

funktioniert mit dem Anführungszeichen leider auch nicht if "var%count%"=="wert" set "ergebnis=y"

0

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
Tilo2300  07.03.2023, 13:45

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

0
Erzesel  07.03.2023, 17:29
@Tilo2300

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...🥴🤕🤤🥳

1