我正在编写一个批处理(.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
如果缺少/q
选项,交换标准错误和标准输出非常重要,因为它允许"您确定吗(Y/N)?"提示在标准错误上可见,与标准输出上的错误消息隔离开来。
rd
命令不会将errorlevel
(错误级别)设置为零,它会保留errorlevel
的原始值:例如,如果之前的操作以正向的errorlevel
结束,并且rd
成功完成,则不会更改errorlevel
。例如:robocopy
中小于4的错误级别是警告而不是错误,可以忽略,因此即使目录已成功删除,以下代码也可能以错误结束:
robocopy ...
if errorlevel 4 goto :error
rd somedir
if errorlevel 1 goto :error
解决方案:忽略该错误,并检查在运行了rd
命令后目录是否仍然存在:
解决方案:忽略错误并检查rd
命令执行后目录是否仍然存在:
rd somedir
if exist somedir goto :error
||
如果一个内部文件夹因访问被阻止,则完全不起作用Access is denied
。RD
只具有0
退出代码。 - it3xl