Primero, repasemos lo que rm -rfhace:
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
Hay tres escenarios en los que rm -rfse usa comúnmente donde se espera que regrese 0:
- La ruta especificada no existe.
- La ruta especificada existe y es un directorio.
- La ruta especificada existe y es un archivo.
Voy a ignorar todo el tema de los permisos, pero nadie usa permisos ni intenta negarse a sí mismo el acceso de escritura a las cosas en Windows de todos modos (OK, eso es una broma ...).
Primero establezca ERRORLEVELen 0 y luego elimine la ruta solo si existe, utilizando diferentes comandos dependiendo de si es o no un directorio. IF EXISTno se establece ERRORLEVELen 0 si la ruta no existe, por lo ERRORLEVELque es necesario establecerlo en 0 primero para detectar correctamente el éxito de una manera que imite el rm -rfuso normal . Proteger el RDcon IF EXISTes necesario porque RD, a diferencia rm -f, arrojará un error si el objetivo no existe.
El siguiente fragmento de script supone que DELPATH está precomillado. (Esto es seguro cuando haces algo como SET DELPATH=%1. Intenta poner ECHO %1un .cmdy pasarle una discusión con espacios en él y ver qué pasa por ti mismo). Después de que se complete el fragmento, puede verificar si hay fallas 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%
El punto es que todo es más simple cuando el entorno simplemente se ajusta a POSIX. O si instala un MSYS mínimo y simplemente lo usa.