2012-08-03 57 views
3

我有以下代碼。除了一些問題,它的效果很好。首先,我的「如果不是空白」檢查根本不起作用。其次,每次迭代過程中,它最後一次傳遞服務器名稱爲服務器名和文件夾兩個,這我真的不理解......BAT文件(批處理)中的嵌套循環返回不期望的結果

代碼

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行是不需要的。

回答

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 2012-08-03 20:01:44

+0

@dbenham謝謝。我同意退出是更清楚的,並已作出改變。 – 2012-08-03 20:08:07

+0

@KenWhite我認爲'goto:eof'早於'exit/b',並且期待Raymond Chen從此開始使用它:) – 2012-08-03 20:15:51

相關問題