"rd"删除失败等错误时,将错误级别设置为0退出 [英] "rd" exits with errorlevel set to 0 on error when deletion fails, etc
问题描述
我正在编写一个批处理(.bat)脚本,我需要处理删除文件夹失败的情况.我正在使用%errorlevel%
来捕获退出代码,但是对于rd
命令,它似乎不起作用:
I'm writing a batch (.bat) script and I need to handle the case in which the deletion of a folder fails. I'm using %errorlevel%
to catch the exit code, but in the case of the rd
command it seems not to work:
C:\Users\edo\Desktop>rd testdir
Directory is not empty
C:\Users\edo\Desktop>echo %errorlevel%
0
为什么?你有什么建议?
Why? What do you suggest?
推荐答案
哇,这是我所看到的第二种情况,其中ERRORLEVEL的设置不正确!请参阅 Windows中的文件重定向和%errorlevel%.
Wow, this is the 2nd case I've seen where ERRORLEVEL is not set properly! See File redirection in Windows and %errorlevel%.
解决方案与检测重定向失败的解决方案相同.使用||
运算符对失败采取措施.
The solution is the same as for detecting redirection failure. Use the ||
operator to take action upon failure.
rd testdir || echo The command failed!
奇怪的是,当使用||
运算符时,如果文件夹不为空,则将ERRORLEVEL正确设置为145,否则将其正确设置为2.因此,您甚至不需要执行任何操作.您可以有条件地执行"备注,然后将正确设置错误级别.
The bizarre thing is, when you use the ||
operator, the ERRORLEVEL is then set properly to 145 if the folder was not empty, or 2 if the folder did not exist. So you don't even need to do anything. You could conditionally "execute" a remark, and the errorlevel will then be set properly.
rd testdir || rem
echo %errorlevel%
我认为以上内容提供了完整的信息.但是随后,下面的一系列注释表明,使用/RD /S
时仍然存在潜在的问题.
如果父文件夹下的文件或子文件夹被锁定(在父文件夹下的任何级别),则RD /S /Q PARENT && echo removed || echo failed
将打印出错误消息,但是将触发&&
分支而不是||
分支.非常不幸.如果由于父文件夹本身被锁定而导致命令失败,则||
将正确触发并设置ERRORLEVEL.
I thought the above gave a complete picture. But then a series of comments below demonstrated there are still potential problems when /RD /S
is used.
If a file or subfolder under the parent folder is locked (at any level under parent) then RD /S /Q PARENT && echo removed || echo failed
will print out an error message, but the &&
branch fires instead of the ||
branch. Very unfortunate. If the command fails because the parent folder itself is locked, then ||
will properly fire and set the ERRORLEVEL.
通过将stderr与stdout交换并将结果传递到FINDSTR "^"
,可以在所有情况下检测故障.如果找到匹配项,则肯定有错误.
It is possible to detect failure in all cases by swapping stderr with stdout and piping the result to FINDSTR "^"
. If a match is found, then there must have been an error.
3>&2 2>&1 1>&3 rd /s test | findstr "^" && echo FAILED
缺少/q
时,stderr和stdout的交换很重要,因为它允许您确定(Y/N)吗?".提示在stderr上可见,与stdout上的错误消息分开.
The swap of stderr and stdout is important when /q
is missing because it allows the "Are you sure (Y/N)?" prompt to be visible on stderr, separate from the error message on stdout.
这篇关于"rd"删除失败等错误时,将错误级别设置为0退出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!