"rd" завершает работу с уровнем ошибки, установленным в 0, при ошибке при удалении и т. д.

Я пишу пакетный (.bat) скрипт, и мне нужно обработать случай, когда удаление папки не удается. я использую %errorlevel% поймать код выхода, но в случае rd команда вроде не работает:

C:\Users\edo\Desktop>rd testdir
Directory is not empty

C:\Users\edo\Desktop>echo %errorlevel%
0

Зачем? Что ты предлагаешь?

2 ответа

Решение

Вау, это второй случай, который я видел, где ERRORLEVEL не установлен должным образом! См. Перенаправление файлов в Windows и% errorlevel%.

Решение такое же, как для обнаружения сбоя перенаправления. Использовать || Оператор принять меры в случае отказа.

rd testdir || echo The command failed!

Странная вещь, когда вы используете || В этом случае для параметра ERRORLEVEL будет правильно установлено значение 145, если папка не была пустой, или значение 2, если папка не существовала. Так что вам даже не нужно ничего делать. Вы можете условно "выполнить" замечание, и тогда уровень ошибки будет установлен правильно.

rd testdir || rem
echo %errorlevel%

Обновление 2016-01-21

Еще в апреле 2015 года Андреас Вергисон заявил в комментарии, что || не был установлен ОШИБКА для ошибок "Отказано в доступе" или "... в использовании...". В то время у меня была 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 без изменений: например, если предыдущая операция заканчивается положительно errorlevel а также rd заканчивается успешно выходит errorlevel без изменений. Пример: уровни ошибок robocopy ниже 4 - предупреждения, а не ошибки, и их можно игнорировать, поэтому следующий код может заканчиваться ошибкой, даже если каталог был успешно удален:

robocopy ...
if errorlevel 4 goto :error
rd somedir
if errorlevel 1 goto :error

Решение: игнорируйте ошибку и проверьте, существует ли каталог после rd:

rd somedir
if exist somedir goto :error
Другие вопросы по тегам