2016-07-31 17 views
1

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?

+0

Sie müssen auch verzögerte Expansion verwenden, um Variable 'ddir' im' echo' Kommandozeile ... – aschipfl

+0

'Die% ddir% variabel, weil Sie wird empty.' müssen '! ddir!' mit enabledelayedexpansion verwenden. – TessellatingHeckler

+0

Danke. Jetzt funktioniert es. Ich glaube, ich habe das "delayexpansion" Konzept von Windows Scripting noch nicht wirklich verstanden ... – Pohl7534

Antwort

0

Sie müssen die verzögerte Erweiterung der Variablen und die Erweiterung der Pfadargumente korrekt verwenden. Versuchen Sie dies und lassen Sie mich alle Probleme kennen:

@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 /f %%a in ("!source[%%x]!") do (
    set "ddir=%%~na" & set "dst=%dest%\!ddir!" 
    echo "!source[%%x]!" "!dst!")) 
exit /b 
+0

@ Pohl7534 Wenn das Skript für Sie funktioniert, ziehen Sie es in Betracht, in diesem Thread eine Antwort zu akzeptieren und zu akzeptieren, indem Sie auf "Pfeil nach oben" und "Auswählen" links neben der Antwort klicken. :) – sambul35

+0

Ihr Vorschlag funktioniert, wenn ich den Schalter '/ f' aus der inneren for-Schleife entferne. Wie schon bei @TesselingHeckle bereits erwähnt, war die Verwendung von delayedexpansion für die '! Ddir!' - Variable alles, was im ursprünglichen Skript geändert werden musste. – Pohl7534

+0

Kommentare erlauben keine korrekte Google-Suche. Um Antworten zu finden, müssen sie als Antworten und nicht als Kommentare gepostet werden. – sambul35