Во-первых, давайте рассмотрим, что делает 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 и просто используете его.