itservice
Goto Top

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

Content-Key: 80659

Url: https://administrator.de/contentid/80659

Printed on: April 23, 2024 at 12:04 o'clock

Member: miniversum
miniversum Feb 13, 2008 at 14:30:25 (UTC)
Goto Top
Da mußt du mit Delayedexpansion arbeiten. Hie rmal ein Beispiel:
setlocal enabledelayedexpansion

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 ein
SET COUNTER=1
:loop

echo %COUNTER%
CALL CALL %%VAR%COUNTER%%%

SET /A COUNTER+=1
IF %COUNTER% LEQ 3 GOTO loop
miniversum
Member: bastla
bastla Feb 13, 2008 at 14:32:13 (UTC)
Goto Top
Hallo itservice und willkommen im Forum!

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
Allerdings würde ich folgende Schreibweise wählen (da flexibler):
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
Noch eine Variante (wieder mit fest vorgegebener Anzahl der Variablen):
@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!
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]
Member: itservice
itservice Feb 13, 2008 at 15:01:33 (UTC)
Goto Top
es funktioniert !!!!!!! ....
VIELEN HERZLICHEN DANK an ALLE - SUPI

ausschlaggebend war:
@echo off & setlocal enabledelayedexpansion

das war mir wohl bekannt und hatte das bereits für die verzögerte Variablenauflösung in schleifen () im Kopf .... aber wie das immer so ist .... Blockade ... und 10.000 Augen sehen und wissen mehr als 9.998 - gottlob gibt es foren mit kompetenten Nutzern ....
DANKE Gruß Jörger
Member: itservice
itservice Feb 13, 2008 at 15:02:22 (UTC)
Goto Top
es funktioniert !!!!!!! ....
VIELEN HERZLICHEN DANK an ALLE - SUPI

ausschlaggebend war:
@echo off & setlocal enabledelayedexpansion

das war mir wohl bekannt und hatte das bereits für die verzögerte Variablenauflösung in schleifen () im Kopf .... aber wie das immer so ist .... Blockade ... und 10.000 Augen sehen und wissen mehr als 9.998 - gottlob gibt es foren mit kompetenten Nutzern ....
DANKE Gruß Jörger