Variable erzeugen mit for
Wieso funktioniert das nicht?
Ich bekomme als ausgabe immer nur:
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%
"C:\WINDOWS"
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 77956
Url: https://administrator.de/contentid/77956
Ausgedruckt am: 21.11.2024 um 23:11 Uhr
12 Kommentare
Neuester Kommentar
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?
Was genau willst du denn machen? Kannst du mal das gesamte Script posten?
Hallo christiank und willkommen im Forum!
Was Du vorhast, lässt sich so lösen:
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:
@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:
In diesem Fall wäre das Endergebnis:
Grüße
bastla
[Edit] ~ in der Zeile ) do call :ProcessDir "%%~d" ergänzt. [/Edit]
[Edit2] enabledelayedexpansion entfernt. [/Edit2]
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%
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
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 ...
TestVerzeichnis "C:\Windows"
Grüße
bastla
[Edit] ~ in der Zeile ) do call :ProcessDir "%%~d" ergänzt. [/Edit]
[Edit2] enabledelayedexpansion entfernt. [/Edit2]
@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
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