“RD”与ERRORLEVEL设置出错退出到0时删除失败等“RD”与ERRORLEVEL设置出错退出

2019-06-02 16:30发布

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

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

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

为什么? 你有什么建议?

Answer 1:

哇,这是我见过的第2情况下ERRORLEVEL设置不正确! 见在Windows文件重定向和%ERRORLEVEL% 。

该解决方案是相同的,用于检测重定向失败。 使用|| 运营商采取行动时失败。

rd testdir || echo The command failed!

离奇的是,当你使用|| 操作中,错误级别,然后适当地设置为145,如果该文件夹不为空,或者2如果文件夹不存在。 所以,你甚至不需要做任何事情。 你可以有条件地“执行”了一句话,和错误级别将被设置正确。

rd testdir || rem
echo %errorlevel%

更新2016年1月21日

早在2015年四月,安德烈亚斯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


Answer 2:

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


文章来源: “rd” exits with errorlevel set to 0 on error when deletion fails, etc