Вау, это второй случай, когда я видел, что ERRORLEVEL не установлен должным образом! См. перенаправление файлов в Windows и %errorlevel%.
Решение такое же, как и при обнаружении сбоя перенаправления. Используйте оператор ||
для принятия мер в случае сбоя.
rd testdir || echo The command failed!
Странно то, что когда вы используете оператор ||
, ERRORLEVEL затем правильно устанавливается на 145, если папка не пуста, или на 2, если папка не существует. Так что вам даже не нужно ничего делать. Вы можете условно «выполнить» замечание, и тогда уровень ошибки будет установлен правильно.
rd testdir || rem
echo %errorlevel%
Я думал, что вышеизложенное дало полную картину. Но затем серия комментариев ниже продемонстрировала, что при использовании /RD /S
все еще существуют потенциальные проблемы. Если файл или подпапка в родительской папке заблокированы (на любом уровне родительской папки), то RD /S /Q PARENT && echo removed || echo failed
выведет сообщение об ошибке, но сработает ветвь &&
вместо ветки ||
. Очень жаль. Если команда не удалась из-за того, что сама родительская папка заблокирована, тогда ||
правильно сработает и установит ERRORLEVEL.
Во всех случаях можно обнаружить сбой, заменив stderr на stdout и передав результат в FINDSTR "^"
. Если совпадение найдено, значит, произошла ошибка.
3>&2 2>&1 1>&3 rd /s test | findstr "^" && echo FAILED
Обмен stderr и stdout важен, когда /q
отсутствует, потому что он позволяет задать вопрос «Вы уверены (да/нет)?» подсказка для отображения на стандартном выводе отдельно от сообщения об ошибке на стандартном выходе.
person
dbenham
schedule
21.06.2012