批次:“rd”的退出代码也是错误的

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

 C:\Users\edo\Desktop>rd testdir Directory is not empty C:\Users\edo\Desktop>echo %errorlevel% 0 

为什么? 你有什么build议?
谢谢!

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

解决方案与检测重定向失败相同。 使用|| 操作员在失败时采取行动。

 rd testdir || echo The command failed! 

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

 rd testdir || rem echo %errorlevel% 

更新2016-01-21

早在2015年4月,Andreas Vergison就在评论中声称|| 没有设置ERRORLEVEL为“拒绝访问”或“…使用…”错误。 当时我使用了Windows 7,而且我认为我没有证实他的说法,只是认为他是正确的。 但是我最近在Windows 10中测试过了, || 错误时总是将ERRORLEVEL设置为非零。 请注意(call )是在我运行每个命令之前将ERRORLEVEL强制为0的一种晦涩的方法。 另请注意,我的cmd.exe会话启用了延迟扩展。

 C:\test>(call ) & rd junk && echo OK || echo ERROR !errorlevel! Access is denied. ERROR 5 C:\test>(call ) & rd test && echo OK || echo ERROR !errorlevel! The directory is not empty. ERROR 145 C:\test>(call ) & rd \test && echo OK || echo ERROR !errorlevel! The process cannot access the file because it is being used by another process. ERROR 32 C:\test>(call ) & rd notExists && echo OK || echo ERROR !errorlevel! The system cannot find the file specified. ERROR 2 

rd不会将errorlevel设置为零 – 它会使errorlevel保持不变:fe如果上一个操作在正确的错误errorlevel结束,并且rd成功完成,则会使errorlevel保持不变。 例如:低于4的robocopy错误级别是警告而不是错误,可以忽略,所以即使目录被成功删除,以下代码也可能会以错误结尾:

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

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

 rd somedir if exist somedir goto :error