En primer lugar, vamos a revisar lo 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 se utiliza comúnmente rm -rf
donde se espera para volver 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 asunto de los permisos, pero nadie usa permisos o intenta negarse a sí mismo acceso de escritura en cosas de Windows de todos modos (OK, eso es una broma ...).
Primero set ERRORLEVEL
to 0 y luego elimine la ruta solo si existe, usando diferentes comandos dependiendo de si es un directorio o no. IF EXIST
no establece ERRORLEVEL
en 0 si la ruta de acceso no existe, por lo que establecer el ERRORLEVEL
en 0 primero es necesario para detectar correctamente el éxito de una manera que imita el uso normal de rm -rf
. Proteger el RD
con IF EXIST
es necesario porque RD
, a diferencia de rm -f
, generará un error si el destino no existe.
El siguiente fragmento de script supone que DELPATH está previamente incluido. (Esto es seguro cuando haces algo como SET DELPATH=%1
. Trata de poner ECHO %1
en un .cmd
y pasarle un argumento con espacios y ver qué sucede por ti mismo). Una vez que se complete el fragmento, puede verificar si se produjo un error con 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%
Point is, todo es más simple cuando el entorno solo se ajusta a POSIX. O si instala un MSYS mínimo y simplemente lo usa.
¿El del/s (a) no funcionan en absoluto (sólo está disponible en algunas versiones) o (b) dejar la directorio de nivel superior, pero elimine todo lo que está debajo de él o (c) deje todos los directorios mientras elimina todos los archivos? – wnoise
@ Aaron, respuesta c, necesita usar rmdir/s para eliminar directorios y archivos. – Wedge
¿No es realmente 'format c:' luego instalación de Linux? Estoy bromeando, por supuesto. –