christiank
Goto Top

Variable erzeugen mit for

Wieso funktioniert das nicht?

for %%d in (
	"%ALLUSERSPROFILE%"  
	"%USERPROFILE%"  
	"C:\Documents and Settings\LocalService"  
	"C:\Documents and Settings\NetworkService"  
	"D:\System Volume Information"  
	"D:\Recycler"  
	"%ProgramFiles%"  
	"%SystemRoot%"  
) do set ExcludeDirs=%ExcludeDirs% %%d
echo %ExcludeDirs%
Ich bekomme als ausgabe immer nur:
 "C:\WINDOWS"  

Content-Key: 77956

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

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

Member: TuXHunt3R
TuXHunt3R Jan 12, 2008 at 15:34:59 (UTC)
Goto Top
Weil die Variable "ExcludeDirs" immer überschrieben und der aktuelle Inhalt hineingeschrieben wird. Wenn du so etwas machen willst, brauchst du ein eindimensionales Array (1 Spalte, x Zeilen). Da es bei Batch aber keine Arrays gibt, wird das hier nicht gehen.

Was genau willst du denn machen? Kannst du mal das gesamte Script posten?
Member: christiank
christiank Jan 12, 2008 at 15:52:25 (UTC)
Goto Top
Hatte es zuerst so:
set ExcludeDirs="%ALLUSERSPROFILE%"  
set ExcludeDirs=%ExcludeDirs% "%USERPROFILE%"  
set ExcludeDirs=%ExcludeDirs% "C:\Documents and Settings\LocalService"  
set ExcludeDirs=%ExcludeDirs% "C:\Documents and Settings\NetworkService"  
set ExcludeDirs=%ExcludeDirs% "C:\System Volume Information"  
set ExcludeDirs=%ExcludeDirs% "C:\Recycler"  
set ExcludeDirs=%ExcludeDirs% "%ProgramFiles%"  
set ExcludeDirs=%ExcludeDirs% "%SystemRoot%"  

Ergebnis:
"C:\Dokumente und Einstellungen\All Users" "C:\Dokumente und Einstellungen\afu"  
"C:\Documents and Settings\LocalService" "C:\Documents and Settings\NetworkServi  
ce" "C:\System Volume Information" "C:\Recycler" "C:\Programme" "C:\WINDOWS"  

Nachdem ich das aber nicht besonders "hübsch" zum erweitern finde, dachte ich mir, man könnte es via for lösen...
Ziel ist es, eine Variable zu haben in der jeder Wert in der Schleife auftaucht.
Member: Dani
Dani Jan 12, 2008 at 16:08:13 (UTC)
Goto Top
Hallo Christian,
probier es mal so:
do set ExcludeDirs="%ExcludeDirs% %%d"  
oder
do set 2ExcludeDirs=%ExcludeDirs% %%d"


Grüße
Dani
Member: christiank
christiank Jan 12, 2008 at 16:17:53 (UTC)
Goto Top
Weder
do set ExcludeDirs="%ExcludeDirs% %%d"  
noch
do set "ExcludeDirs=%ExcludeDirs% %%d"  
funktioniert
Member: bastla
bastla Jan 12, 2008 at 16:21:41 (UTC)
Goto Top
Hallo christiank und willkommen im Forum!

Was Du vorhast, lässt sich so lösen:
@echo off & setlocal enabledelayedexpansion
for %%d in (
	"%ALLUSERSPROFILE%"  
	"%USERPROFILE%"  
	"C:\Documents and Settings\LocalService"  
	"C:\Documents and Settings\NetworkService"  
	"D:\System Volume Information"  
	"D:\Recycler"  
	"%ProgramFiles%"  
	"%SystemRoot%"  
) do set ExcludeDirs=!ExcludeDirs! %%d
echo %ExcludeDirs%
Voraussetzung ist dabei nur, dass keines der angeführten Verzeichnisse ein "!" im Namen hat, da dieses einfach wegfallen würde.

Zur Vermeidung dieses Problems käme als Alternativvariante in Frage:
@echo off & setlocal
for %%d in (
	"%ALLUSERSPROFILE%"  
	"%USERPROFILE%"  
	"C:\Documents and Settings\LocalService"  
	"C:\Documents and Settings\NetworkService"  
	"D:\System Volume Information"  
	"D:\Recycler"  
	"%ProgramFiles%"  
	"%SystemRoot%"  
) do call :ProcessDir "%%~d"  
echo %ExcludeDirs%
goto :eof

:ProcessDir
set ExcludeDirs=%ExcludeDirs% %1
goto :eof
@TuXHunt3R
Die Variable %ExcludeDirs% soll ja bei jedem Durchlauf überschrieben werden, und zwar mit dem bisherigen Wert und zusätzlich (nach einem Leerzeichen) dem entsprechenden Verzeichnispfad.

Funktionieren kann das aber nur, wenn in jedem Schleifendurchlauf der Wert der Variablen %ExcludeDirs% neu eingelesen wird. Genau dies wird durch die "verzögerte Variablenauflösung" ("delayedexpansion") ermöglicht. Ohne "delayedexpansion" wird nur einmal, am Beginn der Schleife, der Wert für %ExcludeDirs% ermittelt, und der ist zu diesem Zeitpunkt noch nicht vorhanden ...

Testen kannst Du das, indem Du einfach vor der Schleife bereits eine Wertzuweisung vornimmst:
set ExcludeDirs=TestVerzeichnis
for ...
In diesem Fall wäre das Endergebnis:
TestVerzeichnis "C:\Windows"  

Grüße
bastla

[Edit] ~ in der Zeile ) do call :ProcessDir "%%~d" ergänzt. [/Edit]
[Edit2] enabledelayedexpansion entfernt. [/Edit2]
Member: christiank
christiank Jan 12, 2008 at 16:42:22 (UTC)
Goto Top
Schon mal gar nicht schlecht, nur leider noch ein problem. Ich habe wirklich verzeichnisse mit einem ! und somit muß ich deinen zweiten vorschlag verwenden, jedoch hat der nen problem, aber sie selbst:
@echo off & setlocal enabledelayedexpansion
for %%d in (
	"%ALLUSERSPROFILE%"  
	"%USERPROFILE%"  
	"C:\Documents and Settings\LocalService"  
	"C:\Documents and Settings\NetworkService"  
	"D:\System Volume Information"  
	"D:\Recycler"  
	"%ProgramFiles%"  
	"%SystemRoot%"  
	"C:\Test!!!"  
) do call :ProcessDir "%%d"  
echo %ExcludeDirs%
goto :eof

:ProcessDir
set ExcludeDirs=%ExcludeDirs% %1
goto :eof

Ausgabe:
 ""C:\Dokumente ""C:\Dokumente ""C:\Documents ""C:\Documents ""D:\System ""D:\Re  
cycler"" ""C:\Programme"" ""C:\WINDOWS"" ""C:\Test""  

Dabei hätte ich gern das da stehen:
"C:\Dokumente und Einstellungen\All Users" "C:\Dokumente und Einstellungen\afu"  
"C:\Documents and Settings\LocalService" "C:\Documents and Settings\NetworkServi  
ce" "C:\System Volume Information" "C:\Recycler" "C:\Programme" "C:\WINDOWS" "C:  
\Test!!!"  

Was mir auch noch auffällt, dass die ! auch nicht dabei sind und überall zwei " vorhanden sind.
Member: bastla
bastla Jan 12, 2008 at 16:47:13 (UTC)
Goto Top
Hallo christiank!

Sorry, war vorhin etwas unkonzentriert ... face-sad

Versuch mal die editierte Fassung.

Grüße
bastla
Member: christiank
christiank Jan 12, 2008 at 16:52:52 (UTC)
Goto Top
Hossa, es klappt.
Da sag ich doch mal danke face-wink
Schönen abend noch.
Noch ne Idee wie man der erste Leerzeichen entfernen könnte?
Member: bastla
bastla Jan 12, 2008 at 17:01:55 (UTC)
Goto Top
Hallo christiank!

Noch ne Idee wie man der erste Leerzeichen entfernen könnte?
An sich sollte es bei einer ev Weiterverarbeitung per "for" ja nicht stören, aber schöner ist's sicher ohne:
:ProcessDir
if defined ExcludeDirs (set ExcludeDirs=%ExcludeDirs% %1) else set ExcludeDirs=%1

Grüße
bastla
Member: miniversum
miniversum Jan 12, 2008 at 17:32:43 (UTC)
Goto Top
Ich will ja nicht klug###erisch sein aber entspricht beim
) do call :ProcessDir "%%~d"
das "%%~d" nicht einem %%d?

miniversum
Member: bastla
bastla Jan 12, 2008 at 17:35:30 (UTC)
Goto Top
@miniversum

Soferne konsequent in der ersten Schleife jedes Verzeichnis unter Anführungszeichen gesetzt wird, ja - aber schadet ja nicht, auf Nummer sicher zu gehen, und so weiß ich, woran ich bin ...

Grüße
bastla
Member: christiank
christiank Jan 12, 2008 at 18:52:30 (UTC)
Goto Top
Perfekt. Was jedes weitere wort wäre zu viel.
Schönen abend und Danke.