Ich schreibe ein Windows-Batch-Skript, das Robocopy verwendet, um Dateien zu sichern. Ich möchte das Verhalten von Linux rsync nachahmen, die standardmäßig das Quellverzeichnis der obersten Ebene zum Zielpfad hinzufügt. Mir ist nicht bewusst, dass robocopy dies tun kann, da nur die Unterverzeichnisse der Quelle zum Ziel kopiert werden. Daher verwende ich das folgende Skript, um das Verzeichnis der obersten Ebene aus dem Pfad zu extrahieren, um es mit zwei geschachtelten for-Schleifen zum Zielpfad hinzuzufügen.Windows Batch-Skript: geschachtelt für Schleifen funktioniert nicht
Ich vereinfachte das Skript unten, um auf den Teil zu konzentrieren, der nicht funktioniert.
@echo off
setlocal enabledelayedexpansion
set source[0]=C:\Users\Sample User\Documents\keys
set source[1]=C:\Users\Sample User\Documents\Custom Office Templates
set dest=C:\Users\Sample User\Documents\test
:: range in for loop specified as (start,step,end)
for /l %%x in (0,1,1) do (
for %%a in ("!source[%%x]!") do (
set ddir=%%~nxa
)
echo "!source[%%x]!" "%dest%\%ddir%"
)
Das Skript die folgende Ausgabe erzeugt:
"C:\Users\Sample User\Documents\keys" "C:\Users\Sample User\Documents\test\"
"C:\Users\Sample User\Documents\Custom Office Templates" "C:\Users\Sample User\Documents\test\"
Das% DDIR% variabel ist leer. Daher wird das Verzeichnis der obersten Ebene des Quellpfads nicht wie gewünscht zum Ziel hinzugefügt. Ich möchte die folgende Ausgabe erreichen:
"C:\Users\Sample User\Documents\keys" "C:\Users\Sample User\Documents\test\keys"
"C:\Users\Sample User\Documents\Custom Office Templates" "C:\Users\Sample User\Documents\test\Custom Office Templates"
getestet I die äußeren und inneren Schleifen für getrennt und dann werden die Teil Skripte funktionieren wie erwartet. Natürlich kann die innere for-Schleife in diesem Fall nicht auf das gesamte Quell-Array zugreifen.
äußere for-Schleife:
@echo off
setlocal enabledelayedexpansion
set source[0]=C:\Users\Sample User\Documents\keys
set source[1]=C:\Users\Sample User\Documents\Custom Office Templates
:: range in for loop specified as (start,step,end)
for /l %%x in (0,1,1) do (
echo "!source[%%x]!"
)
Output:
"C:\Users\Sample User\Documents\keys"
"C:\Users\Sample User\Documents\Custom Office Templates"
Inner for-Schleife:
@echo off
setlocal enabledelayedexpansion
set source[0]=C:\Users\Sample User\Documents\keys
set dest=C:\Users\Sample User\Documents\test
for %%a in ("!source[0]!") do (
set ddir=%%~nxa
)
Output:
"C:\Users\Sample User\Documents\keys" "C:\Users\Sample User\Documents\test\keys"
Irgendwelche Ideen, was mit den geschachtelten for-Schleifen falsch ist?
Sie müssen auch verzögerte Expansion verwenden, um Variable 'ddir' im' echo' Kommandozeile ... – aschipfl
'Die% ddir% variabel, weil Sie wird empty.' müssen '! ddir!' mit enabledelayedexpansion verwenden. – TessellatingHeckler
Danke. Jetzt funktioniert es. Ich glaube, ich habe das "delayexpansion" Konzept von Windows Scripting noch nicht wirklich verstanden ... – Pohl7534