Сначала давайте рассмотрим, что rm -rf
делает:
C:\Users\ohnob\things>touch stuff.txt
C:\Users\ohnob\things>rm -rf stuff.txt
C:\Users\ohnob\things>mkdir stuff.txt
C:\Users\ohnob\things>rm -rf stuff.txt
C:\Users\ohnob\things>ls -l
total 0
C:\Users\ohnob\things>rm -rf stuff.txt
Есть три сценария, где rm -rf
обычно используется, где ожидается возврат 0
:
- Указанный путь не существует.
- Указанный путь существует и является каталогом.
- Указанный путь существует и является файлом.
Я собираюсь игнорировать всю проблему с разрешениями, но никто не использует разрешения и не пытается запретить себе доступ на запись в Windows в любом случае (хорошо, это должно быть шутка…).
Сначала установите ERRORLEVEL
значение 0, а затем удалите путь только в том случае, если он существует, используя различные команды в зависимости от того, является ли он каталогом. IF EXIST
не устанавливается ERRORLEVEL
в 0, если путь не существует, поэтому ERRORLEVEL
сначала необходимо установить значение 0 для правильного определения успеха способом, который имитирует нормальное rm -rf
использование. Защита с RD
помощью IF EXIST
необходима, потому что RD
, в отличие от этого rm -f
, выдаст ошибку, если цель не существует.
Следующий фрагмент сценария предполагает, что DELPATH заключен в кавычки. (Это безопасно , когда вы делаете что - то вроде SET DELPATH=%1
. Попробуйте положить ECHO %1
в .cmd
и передавая ему аргумент с пробелами в ней и посмотреть , что происходит за себя). После завершения фрагмента вы можете проверить наличие ошибок с помощью IF ERRORLEVEL 1
.
: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%
Дело в том, что все проще, когда среда просто соответствует POSIX. Или если вы устанавливаете минимальный MSYS и просто используете его.