我正在编写一个批处理 (.bat) 脚本,我需要处理文件夹删除失败的情况。我%errorlevel%
用来捕获退出代码,但在rd
命令的情况下它似乎不起作用:
C:\Users\edo\Desktop>rd testdir
Directory is not empty
C:\Users\edo\Desktop>echo %errorlevel%
0
为什么?你有什么建议?
我正在编写一个批处理 (.bat) 脚本,我需要处理文件夹删除失败的情况。我%errorlevel%
用来捕获退出代码,但在rd
命令的情况下它似乎不起作用:
C:\Users\edo\Desktop>rd testdir
Directory is not empty
C:\Users\edo\Desktop>echo %errorlevel%
0
为什么?你有什么建议?
哇,这是我见过的第二个 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 上的错误消息分开。
rd
不设置errorlevel
为零 - 它保持errorlevel
不变:fe 如果先前的操作以正数结束errorlevel
并rd
成功完成,它errorlevel
保持不变。示例:robocopy
低于 4 的错误级别是警告而不是错误,可以忽略,因此即使目录已成功删除,以下代码也可能以错误结尾:
robocopy ...
if errorlevel 4 goto :error
rd somedir
if errorlevel 1 goto :error
解决方法:忽略该错误,然后检查目录是否仍然存在rd
:
rd somedir
if exist somedir goto :error