[英]windows batch script: nested for loops not working
我正在编写一个Windows批处理脚本,它使用robocopy来备份文件。 我想模仿linux rsync的行为,它默认将顶级源目录添加到目标路径。 我不知道robocopy可以执行此操作,因为它只将源的子目录复制到目标。 因此,我使用以下脚本从路径中提取顶级目录,以使用两个嵌套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循环,然后部分脚本按预期工作。 当然,在这种情况下,内部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"
内循环:
@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循环有什么问题?
您需要正确使用变量和路径参数扩展的延迟扩展。 试试这个,让我知道任何问题:
@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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.