"rd" exits with errorlevel set to 0 on error when deletion fails, etc

batch-file, cmd, error-handling, exit-code, windows

Solution

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!

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%

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.

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

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.

Problem

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?

Original source

Related problems