Вау, это второй случай, когда я видел, где ERRORLEVEL установлен неправильно! См. File redirection in Windows and %errorlevel%.
Решение такое же, как и для обнаружения отказа перенаправления. Используйте оператор ||
, чтобы принять меры при сбое.
rd testdir || echo The command failed!
Странная вещь, когда вы используете оператор ||
, то ERRORLEVEL затем правильно установить до 145, если папка не была пуста, или 2, если папка не существует. Поэтому вам даже не нужно ничего делать. Вы можете условно «выполнить» замечание, и уровень ошибок будет установлен правильно.
rd testdir || rem
echo %errorlevel%
Обновление 2016-01-21
В апреле 2015 года Андреас Vergison заявил в комментарии, что ||
не ставил ERRORLEVEL для "Access Denied", или»... В Использовать ... ". В то время у меня была 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
Ну, это просто сработало. Я полагаю, что проблема связана с '% errorlevel%' и не имеет ничего общего с 'rd'. Я думаю, что я должен переписать мои обработчики ошибок, используя эту структуру для более детерминированного поведения. Благодаря! – etuardu
Это отлично работает для кодов 2 и 145, но в случае «Доступ запрещен» или «Процесс не может получить доступ к файлу, потому что он используется другим процессом», то он просто оставляет ERRORLEVEL неизменным. :( –
@AndreasVergison - Спасибо! Я обновил свой ответ с вашей информацией. – dbenham