2016-07-31 214 views
1

我正在寫一個windows批處理腳本,它使用robocopy來備份文件。我想模仿linux rsync的行爲,默認情況下會將頂級源目錄添加到目標路徑。我不知道robocopy可以做到這一點,因爲它只將源的子目錄複製到目的地。因此,我使用以下腳本從路徑中提取頂級目錄,以使用兩個嵌套for循環將其添加到目標路徑。windows批處理腳本:嵌套for循環不工作

我簡化了下面的腳本,重點關注不工作的部分。

@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%" 
) 

該腳本產生以下輸出:

"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\" 

的%DDIR%變量是空的。因此,源路徑的頂級目錄不會按照我的意圖添加到目標。我想實現以下輸出:

"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" 

我測試了外部和內部for循環,然後部分腳本按預期工作。當然,在這種情況下,inner for循環無法訪問整個源數組。

外for循環:

@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]!" 
) 

輸出:

"C:\Users\Sample User\Documents\keys" 
"C:\Users\Sample User\Documents\Custom Office Templates" 

內部for循環:

@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 
) 

輸出:

"C:\Users\Sample User\Documents\keys" "C:\Users\Sample User\Documents\test\keys" 

任何想法嵌套for循環有什麼問題?

+0

您也需要使用延遲擴張變量'ddir'在'echo'命令行... – aschipfl

+0

'的%DDIR%變量empty.'因爲你需要使用'!ddir!'和enabledelayedexpansion。 – TessellatingHeckler

+0

謝謝。現在它可以工作。我認爲我還沒有真正理解windows腳本的「delayedexpansion」概念,但是...... – Pohl7534

回答

0

您需要正確使用延遲擴展的變量和路徑參數擴展。試試這個,讓我知道的任何問題:

@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如果該腳本適用於您,請考慮通過單擊答案左側的「向上箭頭」和「選擇」標誌來選擇並接受本主題中的任何答案。 :) – sambul35

+0

如果我從內部for循環中刪除'/ f'開關,您的建議可行。正如@TessellatingHeckle已經指出的那樣,所有需要在原始腳本中改變的地方都是使用delayedexpansion來擴展'!ddir!'變量。 – Pohl7534

+0

評論不允許Google進行適當的搜索。要找到答案,他們必須發佈爲答案,而不是評論。 – sambul35