Batch Variable in Variablennamen ausgeben?

1 Antwort

Batch ist sehr "speziell" , komplexe Aufgaben sind eigentlich nicht vorgesehen.

Batch kennt auch keine Arrays man kann lediglich einzelne VariablenNamen zusammenbasteln, welche sich ähnlich Arrays verhalten, also was Du vorhast.

Diesbezüglich gibt es verschieden Varianten , wie man den Inhalt derartiger Variablen abruft:

Klassisch_mit_call.cmd

@echo off
set "counter=0"
set /a "counter+=1"
set "save%counter%=test%counter%"
call echo der Inhalt ist %%save%counter%%%   
pause

Vezoegerte_Expansion.cmd

@echo off
setlocal enableDelayedExpansion
set "counter=0"
set /a "counter+=1"
set "save%counter%=test%counter%"
echo der Inhalt ist: !save%counter%!
pause

Mehrere Variablen belegen und ausgeben:

@echo off
setlocal enableDelayedExpansion


for /l %%a in (1,1,20) do (
   set "save%%a=test%%a"
)


for /l %%a in (1,1,20) do (
    echo mache was irgendwas  mit dem Wert !save%%a!
)
   rem alle  save-Vars  in Datei speichern
set "save" >"save.txt"
  rem alle  sav-vars   löschen
for /f "tokens=1 delims==" %%a in ('set "save"')  do (set "%%a=")
set "save"  &rem  jetz  sollte  ein Fehlemeldung  kommen
timeout 3
  rem  wieder  aus  Datei einlesen
for /f "usebackq tokens=*" %%a in ("save.txt")  do (set "%%a")
set "save"  &rem  alle  wieder  da
pause

DelayedExpansion hat den Nachteil, dass das Ausrufezeichen nicht in Texten und eingaben auftreten darf , sonst kann es zu unerwarteten Reaktione/Ergebnissen kommen. in solchen Fällen sollte man mit call arbeiten. ( allerdings funktionieren if- vergleiche nicht mit vorangestelltem call)

@echo off

for /l %%a in (1,1,20) do (
  set "save%%a=test%%a"
)

for /l %%a in (1,1,20) do (
  call echo mache was irgendwas mit dem Wert %%save%%a%%
)

 rem oder bei umfangreicheren Operationen bzw if_vergleichen
for /l %%a in (1,1,20) do (
  call :MeinUnterprogramm "%%save%%a%%"
)
pause
exit /b

:::subroutines:::

:MeinUnterprogramm
echo Mir wurde der Wert: %~1 uebergeben
if /i "%~1"=="test18" (
  echo "%~1" gefunden
) else (
 echo "der uebergebene Parameter ist "%~1" ist nicht "test18"
)
exit /b

Batch ist tückisch und auch nicht mehr Zeitgemäß.

Für komplexere Aufgaben solltest Du besser Powershell verwenden. Powershell ist leichter zu handhaben und verfügt über alle Datenstrukturen , welche auch große Programmiersprachen wie C# oder Java aufweisen:

demo.ps1

$MeinArray=1..20|ForEach-Object{
    "test$_"
}


Write-Host 'der Inhalt des Arrays $MeinArray ist:' -fo green 
$MeinArray
sleep 5

 #etwas mit den gespecherten Werten   machen
$MeinArray|ForEach-Object{
    Write-Host Mir wurde der Wert: $_ uebergeben
    if ($_ -eq "test18"){
        Write-Host """$_"" gefunden"  -fo green
    }
    else {
        Write-Host "der uebergebene Parameter ist ""$_"" ist nicht ""test18""" -fo  red
    }
}
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren