当删除失败时,"rd"退出并将errorlevel设置为0,等等

etu*_*rdu 13 windows error-handling cmd batch-file exit-code

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

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

C:\Users\edo\Desktop>echo %errorlevel%
0
Run Code Online (Sandbox Code Playgroud)

为什么?你有什么建议?

dbe*_*ham 24

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

解决方案与检测重定向失败的解决方案相同.使用||操作员在发生故障时采取措施.

rd testdir || echo The command failed!
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当你使用||操作符时,如果文件夹不为空,则ERRORLEVEL正确设置为145,如果文件夹不存在则设置为2.所以你甚至不需要做任何事情.您可以有条件地"执行"一个注释,然后将正确设置errorlevel.

rd testdir || rem
echo %errorlevel%
Run Code Online (Sandbox Code Playgroud)

更新2016-01-21

早在2015年4月,Andreas Vergison在评论中声称/RD /S没有为"拒绝访问"或"......使用中......"错误设置ERRORLEVEL.我当时有Windows 7,我认为我没有验证他的说法,但只是假设他是正确的.但我最近在Windows 10中进行了测试,并且RD /S /Q PARENT && echo removed || echo failed在出错时总是将ERRORLEVEL设置为非零.请注意,这&&是在运行每个命令之前将ERRORLEVEL强制为0的一种神秘方式.另请注意,我的cmd.exe会话已启用延迟扩展.

3>&2 2>&1 1>&3 rd /s test | findstr "^" && echo FAILED
Run Code Online (Sandbox Code Playgroud)

  • 这适用于代码2和145,但是如果"拒绝访问"或"进程无法访问该文件,因为它正被另一个进程使用",那么它只会保持ERRORLEVEL不变.:( (4认同)

ryc*_*chu 8

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

robocopy ...
if errorlevel 4 goto :error
rd somedir
if errorlevel 1 goto :error
Run Code Online (Sandbox Code Playgroud)

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

rd somedir
if exist somedir goto :error
Run Code Online (Sandbox Code Playgroud)

  • 还有关于`robocopy`:在检查它不是>= 4 后,请确保**不要** 使用`set errorlevel=0` 重置错误级别,因为此命令会创建一个永久覆盖内部错误级别的环境变量。阅读 [此处](http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx) (2认同)