Primero, repasemos lo que rm -rf
hace:
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 -rf
se 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 ERRORLEVEL
en 0 y luego elimine la ruta solo si existe, utilizando diferentes comandos dependiendo de si es o no un directorio. IF EXIST
no se establece ERRORLEVEL
en 0 si la ruta no existe, por lo ERRORLEVEL
que es necesario establecerlo en 0 primero para detectar correctamente el éxito de una manera que imite el rm -rf
uso normal . Proteger el RD
con IF EXIST
es 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 %1
un .cmd
y 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.