Exist, Rmdir и %errorlevel% в пакетной версии Windows

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

Допустим, я хочу удалить каталог с файлами в нем. Но я не хочу, чтобы скрипт продолжал выполняться в случае ошибки. Итак, я попытался:

ECHO 3. Deleting Client index folder which will be rebuilt if it actually exist...
rmdir /S /Q "XXX"
ECHO %ERRORLEVEL%
IF %ERRORLEVEL% NEQ 0 ECHO Failed to delete client index folder... & GOTO :End

Но переменная %ERRORLEVEL% всегда была равна 0. введите здесь описание изображения

Затем я нашел похожие вопросы в Stackoverflow и изменил сценарий на этот:

ECHO 3. Deleting Client index folder which will be rebuilt if it actually exist...
rmdir /S /Q "XXX" && echo OK || echo ERROR
ECHO %ERRORLEVEL%
IF %ERRORLEVEL% NEQ 0 ECHO Failed to delete client index folder... & GOTO :End

И это сработало хорошо! введите здесь описание изображения

Но проблема в том, что я хочу, чтобы скрипт продолжал работать, если папка не существует (т.е. уже удалена). С этой реализацией это не сработало. введите здесь описание изображения

Итак, я изменил сценарий следующим образом:

ECHO 3. Deleting Client index folder which will be rebuilt if it actually exist...
if exist "XXX" (rmdir /S /Q "%4_%5" && echo OK || echo ERROR)
ECHO %ERRORLEVEL%
IF %ERRORLEVEL% NEQ 0 ECHO Failed to delete client index folder... & GOTO :End

Ааааааа, и он перестал снова устанавливать переменную %ErrorLevel% в случае блокировки файла... введите здесь описание изображения

Я пытался удалить скобки после условия «существует». Пытался изменить «если есть» на «2>nul», но ни один из этих вариантов не работает так, как мне нужно. Любые предложения о том, как я должен это исправить?


person Rudean    schedule 29.09.2017    source источник
comment
Обратите внимание, что в вашей ситуации ответ rychu обеспечивает гораздо более простой обходной путь. if exist xxx rd /s /q xxx, затем if exist xxx echo Oops, затем if exist xxx goto :End кратко и понятно.   -  person Harry Johnston    schedule 30.09.2017
comment
Также обратите внимание, что в Windows есть проблема, из-за которой первый rd иногда случайным образом выходит из строя. Вы можете решить эту проблему, повторив первую строку, то есть if exist xxx rd /s /q xxx, за которой следует if exist xxx rd /s /q xxx, а затем проверьте наличие ошибки. Делать это дважды кажется излишним, но это будет делать его более надежным.   -  person Harry Johnston    schedule 30.09.2017
comment
Чувак, ты мой спаситель. Да, первый вариант с попыткой удалить каталог, и если он существует, проверка впоследствии кажется красивой и чистой! Спасибо!   -  person Rudean    schedule 02.10.2017
comment
Во-первых, rd (rmdir) частично работает для errno 32 (файл используется другим процессом), то есть работает, только если флаг /s не используется. Во-вторых, это вообще не работает для errno 5 (отказано в доступе), если этот отказ в доступе исходит из какого-то файла внутри целевого каталога. См. комментарии в разделе stackoverflow.com/a/11137825/4807875.   -  person Alexander Samoylov    schedule 16.11.2018