equest
Goto Top

Batch - Variablen werden nicht richtig gesetzt

Hi Community,
ich habe ein Problem mit folgendem Skript:

@echo off

set /a i=0

set zield_1=C:
set zield_2=D:
set zield_3=E:

for /L %%i IN (1,1,3) do (
	set zield_x=
	if "%%i"=="1" (  
		echo zield_x hat den Wert %zield_x% und wird gesetzt auf %zield_1%
		set zield_x=%zield_1%
	)
	if "%%i"=="2" (  
		echo zield_x hat den Wert %zield_x% und wird gesetzt auf %zield_2%
		set zield_x=%zield_2%
	)
	if "%%i"=="3" (  
		echo zield_x hat den Wert %zield_x% und wird gesetzt auf %zield_3%
		set zield_x=%zield_3%
	)
	echo %zield_x%
)

Was ich will ist, dass je nachdem, welchen Wert der Counter i hat, die Variable zield_x verschieden initialisiert wird (um so später all meine
Verzeichnisse durchlaufen zu können). Nur irgendwie wird die Variable immer nur mit E: initialisiert o0
Folgende Ausgabe erscheint:
	zield_x hat den Wert E: und wird gesetzt auf C:
	E:
	zield_x hat den Wert E: und wird gesetzt auf D:
	E:
	zield_x hat den Wert E: und wird gesetzt auf E:
	E:

Danke im Vorraus für eure Hilfestellungen!

Content-ID: 150099

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

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

BigWim
BigWim 01.09.2010 um 10:46:34 Uhr
Goto Top
Ich bin mir (fast) sicher, dass Dir ein

SETLOCAL ENABLEEXTENSIONS 

fehlt.

Um innerhalb von for-Schleifen Variablen zu setzen, mußt Du die "verzögerte Erweiterung von Umgebungsvariablen" einschalten.

Siehe mal unter

help set
help setlocal
help cmd (Parameter /V)

Markus
bastla
bastla 01.09.2010 um 11:01:25 Uhr
Goto Top
@BigWim
Richtiges Stichwort, falscher Befehl - benötigt wird "setlocal enabledelayedexpansion" ...

@eQuest
In den meisten Fällen macht es in Batch wenig Sinn, "Pseudo-Arrays" zu erzeugen - meist genügt es, sofort (in der Schleife oder einem per "call :Unterprogramm" aufgerufenen - internen - Unterprogramm) die nötigen Bearbeitungsschritte für jedes Laufwerk durchzuführen - Du könntest also etwa schreiben:
for %%i in (C: D: E:) do echo Bearbeite Laufwerk %%i
oder
for %%i in (C: D: E:) do (
    echo Bearbeite Laufwerk %%i
)
oder
for %%i in (C: D: E:) do call :ProcessDrive %%i
goto :eof

:ProcessDrive
echo Bearbeite Laufwerk %1
goto :eof
Da sich das Unterprogramm wie ein eigener Batch verhält, kommt der übergebene Parameter dort als %1 an ...
Um aber, der Vollständigkeit halber, auch auf die ursprüngliche Variante einzugehen:
@echo off & setlocal enabledelayedexpansion

set zield_1=C:
set zield_2=D:
set zield_3=E:

for /L %%i IN (1,1,3) do (
    echo zield_x hat den Wert !zield_x! und wird gesetzt auf %zield_1% 
    set "zield_x=!zield_%%i!"  
    echo !zield_x!
)
Grüße
bastla
eQuest
eQuest 01.09.2010 um 11:16:54 Uhr
Goto Top
danke für die schnellen Hilfestellungen.

Also ich habe das jetz mal probiert mit dem "setlocal enabledelayedexpansion", aber geändert hat sich irgendwie nichts face-confused
Das Skript schaut jetzt folgendermaßen aus:

@echo off & setlocal enabledelayedexpansion

set /a i=0

set zield_1=C:
set zield_2=D:
set zield_3=E:

for /L %%i IN (1,1,3) do (
	set "zield_x=!zield_%%i!"   

	echo %zield_x%
)

Er meint immer noch E:, E:, E: ..

Nja ich mache ja die for-schleife für eine bessere Struktur und weniger Code. Der Bearbeitungscode für die Ordner würde unter den 3 If's stehen bei "echo %zield_X%". Natürlich könnte ich das auch 3mal schreiben in den einzelnen Ifs, aber dann könnte ich mir die ganzen if's und das for sparen und für jeden Ordner die 20 Zeilen Bearbeitung richtig hässlich untereinander schreiben ^^"
bastla
bastla 01.09.2010 um 11:22:17 Uhr
Goto Top
Hallo eQuest!

Du hast Deinen Test gestartet, bevor ich meinen Kommentar um die Beispiele ergänzt hatte - versuch es also vielleicht damit nochmals ...

... und, wichtig: Jede Variable, deren Wert erst in der Schleife geändert wurde, muss mit "!" anstelle von "%" geschrieben werden, um diesen geänderten Wert auch sofort verwenden zu können.

Grüße
bastla
eQuest
eQuest 01.09.2010 um 11:23:51 Uhr
Goto Top
ahh verwirrung :D
ok habe jetz deine neue variante gesehen und sie funktioniert, danke ^^
eQuest
eQuest 02.09.2010 um 10:46:55 Uhr
Goto Top