Windows Befehlszeile (cmd.exe) - Auswertung indizierte oder geschachtelte Variable
Hallo,
ich arbeite im administrativen Bereich sehr viel mit Scripten (Batch-Dateien) unter XP/Win2003 zur Automatisierung diverser Abläufe und glaube, mich darin recht gut auszukennen, die bisherigen Ergebnisse sind funktional und durchaus effektiv.
Ich knoble aber seit einiger Zeit an einem Problem und komme auch nach eingehender Recherche im Internet einfach nicht weiter. Es kann auch sein, daß ich darin eine vollige Blockade habe oder einfach zuviel von der Befehlszeile fordere....
Nun zum Problem (ich versuche am Beispiel einfach zu veranschaulichen). Bitte nicht die Sinnhaftigkeit des Inhaltes beachten, sondern die Struktur, danke:
Über ein eigenes Script (Parameterdatei) sind mehrfach Variablen definiert, die durchnummeriert werden und als Inhalt jeweils einen Befehl besitzen (Bsp.):
SET VAR1=defrag c
SET VAR2=ntbackup ....
SET VAR3=....
Über ein "Steuerprogramm" der gleichen Instanz sollen in einer Schleife die Variablen-Inhalte (also die dahinterliegenden Befehle) nacheinander per START abgearbeitet werden (abstrahierte Form):
SET COUNTER=1
:loop
echo %COUNTER%
CALL VAR%COUNTER% <---- hier liegt das "Problem"
SET /A COUNTER+=1
IF %COUNTER% LEQ 3 GOTO loop
Was muß ich tun oder syntaktisch angeben, um im ersten Schleifendurchlauf hinter dem CALL nicht "VAR1", sondern "defrag c" stehen zu haben. Eine weitergehende Schachtelung??? ... mit % geht nicht, da vor Ausführung der Zeile erst die ganze Zeile ausgewertet wird:
CALL %VAR%COUNTER%% ergibt natürlich "COUNTER%" und ist Blödsinn...
Eine Zwischenspeicherung über
SET BEFEHL=VAR%COUNTER% und
CALL %BEFEHL%
bringt ja auch nichts, da ich nicht "VAR1" ausführen will sondern das, was hinter VAR1 steht.
Andere Sonderzeichen ((,[, etc.) zur Auflösung einer Verschachtelung haben mir auch nicht weitergeholfen...
Ich denke, ich konnte mein Problem einfach und verständlich formulieren und hoffe auf einen Spezialisten, der mir meine Scheuklappen aufdeckt - vielen herzlichen Dank!!
Gruß Jörger
ich arbeite im administrativen Bereich sehr viel mit Scripten (Batch-Dateien) unter XP/Win2003 zur Automatisierung diverser Abläufe und glaube, mich darin recht gut auszukennen, die bisherigen Ergebnisse sind funktional und durchaus effektiv.
Ich knoble aber seit einiger Zeit an einem Problem und komme auch nach eingehender Recherche im Internet einfach nicht weiter. Es kann auch sein, daß ich darin eine vollige Blockade habe oder einfach zuviel von der Befehlszeile fordere....
Nun zum Problem (ich versuche am Beispiel einfach zu veranschaulichen). Bitte nicht die Sinnhaftigkeit des Inhaltes beachten, sondern die Struktur, danke:
Über ein eigenes Script (Parameterdatei) sind mehrfach Variablen definiert, die durchnummeriert werden und als Inhalt jeweils einen Befehl besitzen (Bsp.):
SET VAR1=defrag c
SET VAR2=ntbackup ....
SET VAR3=....
Über ein "Steuerprogramm" der gleichen Instanz sollen in einer Schleife die Variablen-Inhalte (also die dahinterliegenden Befehle) nacheinander per START abgearbeitet werden (abstrahierte Form):
SET COUNTER=1
:loop
echo %COUNTER%
CALL VAR%COUNTER% <---- hier liegt das "Problem"
SET /A COUNTER+=1
IF %COUNTER% LEQ 3 GOTO loop
Was muß ich tun oder syntaktisch angeben, um im ersten Schleifendurchlauf hinter dem CALL nicht "VAR1", sondern "defrag c" stehen zu haben. Eine weitergehende Schachtelung??? ... mit % geht nicht, da vor Ausführung der Zeile erst die ganze Zeile ausgewertet wird:
CALL %VAR%COUNTER%% ergibt natürlich "COUNTER%" und ist Blödsinn...
Eine Zwischenspeicherung über
SET BEFEHL=VAR%COUNTER% und
CALL %BEFEHL%
bringt ja auch nichts, da ich nicht "VAR1" ausführen will sondern das, was hinter VAR1 steht.
Andere Sonderzeichen ((,[, etc.) zur Auflösung einer Verschachtelung haben mir auch nicht weitergeholfen...
Ich denke, ich konnte mein Problem einfach und verständlich formulieren und hoffe auf einen Spezialisten, der mir meine Scheuklappen aufdeckt - vielen herzlichen Dank!!
Gruß Jörger
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 80659
Url: https://administrator.de/contentid/80659
Ausgedruckt am: 15.11.2024 um 03:11 Uhr
4 Kommentare
Neuester Kommentar
Da mußt du mit Delayedexpansion arbeiten. Hie rmal ein Beispiel:
Alternativ gehts auch so:
miniversum
setlocal enabledelayedexpansion
set Var1=Hallo
set Var2=du
set Var3=da
FOR /L %%i IN (1,1,3) DO echo !Var%%i!
set Var1=Hallo
set Var2=du
set Var3=da
FOR /L %%i IN (1,1,3) DO echo !Var%%i!
Alternativ gehts auch so:
set Var1=Hallo
set Var2=du
set Var3=da
FOR /L %%i IN (1,1,3) DO call echo %%Var%%i%%
In deinem Fall wäre das also dann einset Var2=du
set Var3=da
FOR /L %%i IN (1,1,3) DO call echo %%Var%%i%%
SET COUNTER=1
:loop
echo %COUNTER%
CALL CALL %%VAR%COUNTER%%%
SET /A COUNTER+=1
IF %COUNTER% LEQ 3 GOTO loop
Hallo itservice und willkommen im Forum!
Ein klassischer Fall für die Verwendung von "delayedexpansion":
Allerdings würde ich folgende Schreibweise wählen (da flexibler):
Noch eine Variante (wieder mit fest vorgegebener Anzahl der Variablen):
Allen Versionen gemeinsam ist die "!"-Problematik der "delayedexpansion" - da "!" eine besonder Bedeutung erhält, wird es in der Verarbeitung von Texten/Variableninhalten einfach weggelassen - bei zwei "!" in einer Zeile auch der Teil dazwischen. Als Demo habe ich Deine "echo"-Zeile ein wenig variiert.
Grüße
bastla
[Edit] Na gut, wieder zu langsam ... [/Edit]
Ein klassischer Fall für die Verwendung von "delayedexpansion":
@echo off & setlocal enabledelayedexpansion
SET VAR1=defrag c
SET VAR2=ntbackup ....
SET VAR3=....
SET COUNTER=1
:loop
echo %COUNTER% ist dran! Und los!
CALL !VAR%COUNTER%!
SET /A COUNTER+=1
IF %COUNTER% LEQ 3 GOTO loop
SET VAR1=defrag c
SET VAR2=ntbackup ....
SET VAR3=....
SET COUNTER=1
:loop
echo %COUNTER% ist dran! Und los!
CALL !VAR%COUNTER%!
SET /A COUNTER+=1
if defined VAR%COUNTER% GOTO :loop
@echo off & setlocal enabledelayedexpansion
SET VAR1=defrag c
SET VAR2=ntbackup ....
SET VAR3=....
for /l %%i in (1,1,3) do (echo %%i) & call !var%%i!
Grüße
bastla
[Edit] Na gut, wieder zu langsam ... [/Edit]