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-Key: 150099

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

Printed on: April 19, 2024 at 01:04 o'clock

Member: BigWim
BigWim Sep 01, 2010 at 08:46:34 (UTC)
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
Member: bastla
bastla Sep 01, 2010 at 09:01:25 (UTC)
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
Member: eQuest
eQuest Sep 01, 2010 at 09:16:54 (UTC)
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 ^^"
Member: bastla
bastla Sep 01, 2010 at 09:22:17 (UTC)
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
Member: eQuest
eQuest Sep 01, 2010 at 09:23:51 (UTC)
Goto Top
ahh verwirrung :D
ok habe jetz deine neue variante gesehen und sie funktioniert, danke ^^
Member: eQuest
eQuest Sep 02, 2010 at 08:46:55 (UTC)
Goto Top