【问题标题】:How do I skip an iteration in a loop if it throws an error?如果抛出错误,如何跳过循环中的迭代?
【发布时间】:2015-06-16 23:27:27
【问题描述】:

我在 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 代码知之甚少。因此,如果您的回答清楚地解释了修改的语法应该是什么,我将不胜感激。我知道解决方案与“错误级别”有关,但我不知道如何实施。

【问题讨论】:

  • 刚刚尝试过这种模式,但无法重现您的问题。在我的例子中,循环没有中断,它只是移动到下一个项目。

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


【解决方案1】:

使用if exist 检查robocopy 源文件夹是否存在,如下所示:

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 是一个类似文件的对象,存在于任何现有文件夹中...

【讨论】:

  • 您可能指的是…\Level3\%a\…,而不是…\Level\%a\…。另一方面,if exist folder\ dosomething 也可以。
猜你喜欢
  • 1970-01-01
  • 2013-12-21
  • 2018-01-01
  • 2021-04-15
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多