15

我正在编写一个批处理 (.bat) 脚本,我需要处理文件夹删除失败的情况。我%errorlevel%用来捕获退出代码,但在rd命令的情况下它似乎不起作用:

C:\Users\edo\Desktop>rd testdir
Directory is not empty

C:\Users\edo\Desktop>echo %errorlevel%
0

为什么?你有什么建议?

4

2 回答 2

27

哇,这是我见过的第二个 ERRORLEVEL 设置不正确的情况!请参阅Windows 中的文件重定向和 %errorlevel%

解决方法与检测重定向失败的方法相同。使用||操作员在失败时采取措施。

rd testdir || echo The command failed!

奇怪的是,当您使用||运算符时,如果文件夹不为空,则 ERRORLEVEL 会正确设置为 145,如果文件夹不存在,则设置为 2。所以你甚至不需要做任何事情。您可以有条件地“执行”一个注释,然后错误级别将被正确设置。

rd testdir || rem
echo %errorlevel%

我认为上面给出了一个完整的画面。但随后下面的一系列评论表明,/RD /S使用时仍然存在潜在问题。如果父文件夹下的文件或子文件夹被锁定(在父文件夹下的任何级别),RD /S /Q PARENT && echo removed || echo failed则会打印出错误消息,但&&会触发分支而不是||分支。非常不幸。如果命令因父文件夹本身被锁定而失败,||则将正确触发并设置 ERRORLEVEL。

通过将 stderr 与 stdout 交换并将结果通过管道传输到FINDSTR "^". 如果找到匹配项,则一定有错误。

3>&2 2>&1 1>&3 rd /s test | findstr "^" && echo FAILED

缺少时,stderr 和 stdout 的交换很重要,/q因为它允许“您确定(Y/N)吗?” 提示在 stderr 上可见,与 stdout 上的错误消息分开。

于 2012-06-21T12:09:23.460 回答
10

rd不设置errorlevel为零 - 它保持errorlevel不变:fe 如果先前的操作以正数结束errorlevelrd成功完成,它errorlevel保持不变。示例:robocopy低于 4 的错误级别是警告而不是错误,可以忽略,因此即使目录已成功删除,以下代码也可能以错误结尾:

robocopy ...
if errorlevel 4 goto :error
rd somedir
if errorlevel 1 goto :error

解决方法:忽略该错误,然后检查目录是否仍然存在rd

rd somedir
if exist somedir goto :error
于 2015-04-10T13:36:18.210 回答