Batch Variable in Variablennamen ausgeben?
Hey,
eine spezielle Frage, erstmal ein Beispiel:
@echo off
set /a counter=0
set /a counter=%counter%+1
set save%counter%=test%counter%
echo [save%counter%]
pause>nul
Ich habe hier einen Zähler, der teilweise den Namen der "save"-Variable bestimmt.
Soll dann so aussehen dass er bei "save1" anfängt, dann mit einer Loop immer weiter hochzählt und bei jedem Schritt eine neu nummerierte Variable erstellt.
Mein Problem besteht jetzt darin, den Inhalt der Variable "save%counter%" auszugeben. Der Grund für die Verwendung ist, die aktuell nummerierte Variable auszugeben (ich möchte z.B. im weiteren Verlauf des Skripts den Counter runterzählen lassen und dazu die passende Variable ausgeben (fragt einfach nicht warum).
Ich hätte es z.B. so probiert: echo %save%counter%% aber es funktioniert logischerweise nicht.
Weißt jemand wie man die Variable richtig ausgibt?
Wäre um jede Hilfe dankbar :)
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