BAT文件(批处理)中的嵌套循环返回了不期望的结果。

3
我有以下代码。 它工作得很好,但有几个问题。 首先,我的“if not blank”检查根本不起作用。 其次,在每次迭代期间,它最后一次将服务器名称作为服务器名称和文件夹传递,这一点我真的不理解... 代码
 SET servers=server01,server02
 SET drive=c
 SET root=program files (x86)\test\
 SET backup=%root%\backup 
 SET folders=folder01\,folder02\file01.txt


 FOR %%b in (%servers%) do (
    FOR %%a in (%folders% %%b) DO (
        if not %%a == "" call :backup %%b %%a
    )
 )


:backup
 SET currentfile="\\%1\%drive%$\%2"
 setlocal
 echo Backing Up %currentfile%
 REM mkdir "\\%1\%drive%$\%backup%"
 REM xcopy /I
 exit /b
 endlocal
 goto :end

输出

1] Backing Up "\\server01\c$\folder01\"
2] Backing Up "\\server01\c$\folder02\file01.txt"
3] Backing Up "\\server01\c$\server01"
4] Backing Up "\\server02\c$\folder01\"
5] Backing Up "\\server02\c$\folder02\file01.txt"
6] Backing Up "\\server02\c$\server02"
7] Backing Up "\\\c$\"

如您所见,第3、6和7行不是期望的。

1个回答

4

第3行和第6行是由内部for循环中的%%b引起的。第7行是由于脚本在循环结束后没有终止,因此在结尾再次运行:backup代码。

以下似乎可以得到所需的结果:

@echo off

SET servers=server01,server02
SET drive=c
SET root=program files (x86)\test\
SET backup=%root%\backup 
SET folders=folder01\,folder02\file01.txt


FOR %%b in (%servers%) do (
    FOR %%a in (%folders%) DO (
        rem echo a is %%a
        if not %%a == "" call :backup %%b %%a
    )
)

exit /b


:backup
SET currentfile="\\%1\%drive%$\%2"
setlocal
echo Backing Up %currentfile%
REM mkdir "\\%1\%drive%$\%backup%"
REM xcopy /I
endlocal

1
+1,当我看到你的帖子时,我正在撰写几乎相同的答案。虽然我喜欢使用EXIT /B而不是GOTO :EOF。 - dbenham
@dbenham 谢谢。我同意使用 exit 更清晰,已经进行了更改。 - Matthew Strawbridge
@KenWhite 我认为 goto :eofexit /b 更早出现,而且我相信 Raymond Chen 一直在使用它 :) - Matthew Strawbridge
也许吧。:-) 看他这周的文章,他似乎对批处理方面的变化很了解。等等...你是在叫我吗? :-) - Ken White
@KenWhite - 有evidence表明GOTO :EOF和EXIT /B的实现方式是相同的,除了EXIT /B可以指定返回代码。我喜欢在所有情况下使用一种语法,所以一旦它可用,我就采用了EXIT /B。但大多数“老手”仍然坚持他们最初学到的东西,“年轻人”则从“老手”提供的示例代码中学习。因此,GOTO :EOF仍然在批处理世界中占据着重要地位。没有任何问题 :-) - dbenham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接