如果抛出错误,如何在循环中跳过迭代?

时间:2015-06-16 23:27:27

标签: windows batch-file command-line error-handling cmd

我在Windows 7 cmd中工作。我写了几行代码来从一个非常大的目录树中复制某些文件。这是代码:

for /f "tokens=*" %a in ('dir "L:\Level1\Level2\Level3\\\*." /ad /b') do robocopy "L:\Level1\Level2\Level\%a\Level5\Level6\Level7" "c:\Destination\%a" /E /V /R:1 /W:1 /MT:32 /SEC

基本上,这会进入所有Level4文件夹(在Level3中)并复制在目录其余部分中找到的文件。

我遇到的问题是我的某些Level4文件夹实际上没有Level5 / Level6 / Level7路径。因此,每次循环到达其中一个文件夹时,它都会使循环崩溃。

我想修改上面的代码,以便循环只会跳过导致错误的任何文件夹,然后继续下一步。

我在cmd命令行上运行它。不批量。

我对cmd代码知之甚少。因此,如果您的答案清楚地解释了修改的语法应该是什么,我将不胜感激。我知道解决方案与“errorlevel”有关,但我对如何实现无能为力。

1 个答案:

答案 0 :(得分:3)

使用robocopy检查if exist源文件夹状态,如下所示:

for /f "tokens=*" %a in ('dir "L:\Level1\Level2\Level3\\\*." /ad /b') do if exist "L:\Level1\Level2\Level\%a\Level5\Level6\Level7\nul" robocopy "L:\Level1\Level2\Level\%a\Level5\Level6\Level7" "c:\Destination\%a" /E /V /R:1 /W:1 /MT:32 /SEC

以更易阅读的形式:

for /f "tokens=*" %a in ('dir "L:\Level1\Level2\Level3\\\*." /ad /b') do ^
  if exist "L:\Level1\Level2\Level\%a\Level5\Level6\Level7\nul" ^
    robocopy "L:\Level1\Level2\Level\%a\Level5\Level6\Level7" ^
             "c:\Destination\%a" /E /V /R:1 /W:1 /MT:32 /SEC

请注意folder\nul条件。

NUL是一个类似文件的对象,存在于任何现有文件夹中...