Lassen sich in Batch mehrere Variablen vergleichen?
Moin,
mich würde interessieren, ob es möglich ist, in Batch mehrere Variablen zu vergleichen. Ich habe 5 Variablen (angenommen %Var1% bis %Var5%).
Im ersten Fall möchte ich überprüfen, ob mindestens drei davon gleich sind.
Im zweiten Fall geht es darum zu prüfen, ob ein bestimmer Wert (z.B. X) in mindestens einer der fünf Variablen enthalten ist.
Ist so etwas möglich?
Danke im Voraus für eure Antworten!
4 Antworten
ob ein bestimmer Wert (z.B. X) in mindestens einer der fünf Variablen enthalten ist.
das geht auch mit beliebigen variablennamen
setlocal enabledelayedexpansion
set "x=5"
set "Test=2"
set "eineVariable=5"
set "anderVar=Heinz"
set "Tier=Katze"
set "wasAndres=mit lehrzeichen"
for %%a in (test eineVariable anderVar Tier wasAndres) do if "%X%"=="!%%a!" set /a "found += 1"
if %found% gtr 0 echo %found% Variablen stimmen mit x ueberein
für das er erstere wo jede mit jeder Variable verglichen werden soll muss man schon etwas trickreicher sein:
Kombinationen anzeigen:
setlocal enabledelayedexpansion
liste der Variablen, welche miteinander verglichen werden sollen
set "varlist= var1 var2 var3 var4 var5"
for %%a in (%varlist%) do (
rem entferne die Aktuelle variable aus der inneren Liste
set "varlist=!varlist:%%a=!"
rem mal anzeigen ob noch doppelte Vergleiche getätigt würden...? natürlich nicht
for %%b in (!varlist!) do echo %%a ...vs... %%b
)
Butter bei die Fische:
@echo off
setlocal enabledelayedexpansion
set "Test=2"
set "eineVariable=Katze"
set "anderVar=Katze"
set "Tier=Katze"
set "wasAndres=mit lehrzeichen"
set "varlist=test eineVariable anderVar Tier wasAndres"
for %%a in (%varlist%) do (
rem entferne die Aktuelle variable aus der inneren Liste
set "varlist=!varlist:%%a=!"
for %%b in (!varlist!) do if "!%%a!"=="!%%b!" set /a "found += 1"
)
if %found% geq 3 echo %found% Variablen stimmen ueberein
pause
Wie auch immer , wenn Du derart viele Vergleiche anstellen musst, solltest Du deinem Code noch mal überdenken, da gibt es garantiert eine mathematische Lösung oder dein Gesamtkonzept ist schlecht durchdacht.
ob ein bestimmer Wert (z.B. X) in mindestens einer der fünf Variablen enthalten ist.
Dies sollte recht einfach gehen:
for /L %%i in (1 1 5) do if %X% equ !Var%%i! set /a found += 1
Am Ende ist found == Anzahl der Variablen, die gleich X sind.
Im ersten Fall möchte ich überprüfen, ob mindestens drei davon gleich sind.
Hierfür ein, von der Laufzeit gesehen, komplexerer Algorithmus:
for /L %%i in (1 1 5) do (
set /a currentlyFound = 0
for /L %%j in (1 1 5) do (
if !Var%%i! equ !Var%%j! (
set /a currentlyFound += 1
)
)
if !currentlyFound! geq 3 echo more than 3 elements are !Var%%i!
)
Die Ausgabe erfolgt dann natürlich 3 oder mehr mal (für jeden Index, der eines der 3 mehrfach vorkommenden Elemente enthält).
Hier noch mal das erste Programm mit Beispielvariablen zum Testen:
@echo off & setlocal enabledelayedexpansion
for /L %%i in (1 1 5) do (
set /a Var%%i=!random! %% 3
echo !Var%%i!
)
echo.
set /a X = 2
set /a found = 0
for /L %%i in (1 1 5) do (
if %X% equ !Var%%i! (
set /a found += 1
)
)
echo %X% was found %found% times.
pause
Und das zweite:
@echo off & setlocal enabledelayedexpansion
for /L %%i in (1 1 5) do (
set /a Var%%i=!random! %% 3
echo !Var%%i!
)
echo.
for /L %%i in (1 1 5) do (
set /a currentlyFound = 0
for /L %%j in (1 1 5) do (
if !Var%%i! equ !Var%%j! (
set /a currentlyFound += 1
)
)
if !currentlyFound! geq 3 echo more than 3 elements are !Var%%i!
)
pause
update:
@echo off
setlocal enabledelayedexpansion
for /l %%a in (1,1,100) do (
rem Startwert füt inneren Zähler+1
set /a "_min=%%a+1"
rem mal anzeigen ob noch doppelte Vergleiche getätigt würden...? natürlich nicht
for /l %%b in (!_min!,1,100) do (
set /a "count+=1"
echo !count!... var%%a ...vs... var%%b
)
)
pause
Ja genau deswegen wird der counter ja vor jedem Schleifendurchlauf zurückgesetzt. Formal schöner wäre es vielleicht gleiche Indizes nicht miteinander zu vergleichen und den counter stattdessen mit 1 zu initialisieren ─ läuft aber auf das gleiche hinaus.
Vielleicht hab ich aber doch einen Denkfehler drin... muss ich noch mal drüber schauen.
Bei Zahlen kein Problem. Bei Zeichenketten ohne spezielle Zeichen ebenfalls (man muss sie beim Vergleich in Anführungszeichen einschließen, wenn Trennzeichen wie Leerzeichen oder Kommas drin sind). Zeichenketten mit bestimmten Sonderzeichen führen zu Syntaxfehlern.
Man kann durch mehrere Vergleiche oder geschachtelte Schleifen zählen, wie viele Übereinstimmungen es gibt.
-----
Wenn ein Teilstring in einem String gefunden werden soll, geht das mit find oder findstr. %ERRORLEVEL% wird auf 0 gesetzt, falls die Teilzeichenfolge gefunden wird, ansonsten auf 1.
Okay, danke erstmal, aber was muss ich dann genau in beine Batchdatei schreiben?
Ja das ist möglich, wenn es nicht gerade ein effizientes Skript sein muss, dann können hier IF-Bedingungen eine Abhilfe schaffen.
Ja, das mit den If-Abfragen habe ich mir auch schon gedacht, aber man müsste dann ja sämtliche kombintationen abfragen (besonders beim 2. Beispiel). Gibt es keine einfachere Lösung?
Ich kenne mich mit Batch-Dateien fast gar nicht aus, daher kann ich dir keine wirklich gute Antwort geben. Jedoch kannst du mal nachschauen, ob es mit Looping geht:
https://www.informit.com/articles/article.aspx?p=1154761&seqNum=10
https://stackoverflow.com/questions/19621167/check-multiple-variables-in-batch
du hast da einen Denkfehler drin.
du vergleichst jede Variable 2 mal miteinander und einmal mit sich selbst.
du hast also garantiert 5 Treffer und jeder weitere Treffer Zählt doppelt
Potentielle Lösung:
funktioniert gegenwärtig nur bis 9. (aus var10 wurde nach löschen von var1 nur 0 übrigbleiben)
aber mal ehrlich wenn man 5 Verschiedene Variablen miteinander Vergleichen muss, hat man ein logisches Problem😱🥶 das läuft dan schon auf mathematische Matrizen hinaus.🤢😖