我正在寫一個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循環有什麼問題?
您也需要使用延遲擴張變量'ddir'在'echo'命令行... – aschipfl
'的%DDIR%變量empty.'因爲你需要使用'!ddir!'和enabledelayedexpansion。 – TessellatingHeckler
謝謝。現在它可以工作。我認爲我還沒有真正理解windows腳本的「delayedexpansion」概念,但是...... – Pohl7534