我正在写一个批处理(.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