Lassen sich in Batch mehrere Variablen vergleichen?

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
 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
Erzesel  28.07.2020, 02:17

du hast da einen Denkfehler drin.

for /L %%i in (1 1 5) do (
 for /L %%j in (1 1 5) do (
  echo var%%i==var%%j
  )
)

du vergleichst jede Variable 2 mal miteinander und einmal mit sich selbst.

var1==var1
  • var1==var2
  • var1==var3
  • var1==var4
  • var1==var5
  • var2==var1
var2==var2
  • var2==var3
  • var2==var4
  • var2==var5
  • var3==var1
  • var3==var2
var3==var3
  • var3==var4
  • var3==var5
  • var4==var1
  • var4==var2
  • var4==var3
var4==var4
  • var4==var5
  • var5==var1
  • var5==var2
  • var5==var3
  • var5==var4
var5==var5

du hast also garantiert 5 Treffer und jeder weitere Treffer Zählt doppelt

Potentielle Lösung:

for /l %%a in (1 1 5) do set "varlist=!varlist! var%%a"
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  
)

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.🤢😖

1
Erzesel  29.07.2020, 08:34
@Erzesel

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
0
timlg07  29.07.2020, 21:01
@Erzesel

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.

0

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.

Woher ich das weiß:Berufserfahrung – Software-Entwickler
SGTVP 
Fragesteller
 27.07.2020, 18:00

Okay, danke erstmal, aber was muss ich dann genau in beine Batchdatei schreiben?

0
PWolff  27.07.2020, 20:33
@SGTVP

Das hört sich so an, als seist du absoluter Anfänger, was Batch-Scripte betrifft.

Wie weit bist du inzwischen gekommen?

IF?

GOTO?

SET /A?

0

Ja das ist möglich, wenn es nicht gerade ein effizientes Skript sein muss, dann können hier IF-Bedingungen eine Abhilfe schaffen.

SGTVP 
Fragesteller
 27.07.2020, 17:22

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?

0