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)
rd
未设置errorlevel
为零- errorlevel
保留原样:fe如果先前的操作以正数结尾errorlevel
并rd
成功完成,则保留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)
归档时间: |
|
查看次数: |
9728 次 |
最近记录: |