user340956 estaba dolorosamente cerca de la solución, pero ya sabes lo que dicen de cerca…
Para ser claros, rd /s /q c:\foobar
borra el directorio de destino además de su contenido, pero no siempre quieres borrar el directorio en sí, a veces sólo quieres borrar su contenido y dejar el directorio en paz. El comando deltree
podría hacer esto, pero Micrsoft, en su infinita “sabiduría” eliminó el comando y no lo portó a Windows.
Aquí hay una solución que funciona sin recurrir a herramientas de terceros. Probablemente sea tan simple y eficiente como sea posible con un script de línea de comandos en lugar de escribir un ejecutable real. No establece ninguna variable de entorno y no utiliza ningún bucle. También es tan seguro como puede serlo, con verificación de errores en todas partes posibles, y también tan fácil de usar como sea posible, con documentos incorporados.
dt.bat
(o dt.cmd
para los niños; lo que sea, soy viejo, uso .bat
):
:: dt is a Windows-compatible version of the deltree command
:: Posted to SuperUser by Synetech: https://superuser.com/a/1526232/3279
@echo off
goto start
:start
if ["%~1"]==[""] goto usage
pushd "%~1" 2>nul
if /i not ["%cd%"]==["%~1"] goto wrongdir
rd /s /q "%~1" 2>nul
popd
goto :eof
:usage
echo Delete all of the contents of a directory
echo.
echo ^> %0 DIR
echo.
echo %0 is a substitute for deltree, it recursively deletes the contents
echo (files and folders) of a directory, but not the directory itself
echo.
echo DIR is the directory whose contents are to be deleted
goto :eof
:wrongdir
echo Could not change to the target directory. Invalid directory? Access denied?
goto :eof
Así es como funciona:
- Comprueba si se ha pasado un argumento de línea de comandos, e imprime la información de uso y se cierra si no.
- Utiliza
pushd
para guardar el directorio actual, y luego cambia al directorio de destino, redirigiendo cualquier error al nul
para una experiencia de línea de comandos más limpia (y registros más limpios).
- Comprueba si el directorio actual es ahora el mismo que el directorio de destino, e imprime un mensaje de error y cierra si no lo es. Esto evita borrar accidentalmente el contenido del directorio anterior si el comando
pushd
falló (por ejemplo, pasando un directorio inválido, error de acceso, etc.)
- Esta comprobación no distingue entre mayúsculas y minúsculas, por lo que es usualmente segura en Windows, pero no lo es para ningún sistema de archivos que distinga entre mayúsculas y minúsculas como los que usan los sistemas *nix, incluso en Windows.
- No funciona con nombres de archivos cortos (por ejemplo,
C:\Users\Bob Bobson\foobar
no será visto como el mismo que C:\Users\BobBob~1\foobar
aunque realmente lo sea). Es un ligero inconveniente tener que usar el nombre de archivo no corto, pero es más seguro que lamentable, especialmente porque los SFNs no son completamente confiables o siempre predecibles (e incluso pueden estar deshabilitados por completo).
- Luego usa
rd
para borrar el directorio de destino y todo su contenido, redireccionando cualquier error (que debería haber al menos uno para el directorio mismo) a nul
. Algunas notas sobre esto:
- Debido a que el directorio de destino es el directorio actual, el sistema tiene un archivador abierto en él, y por lo tanto no puede realmente borrarlo, por lo que permanece como está, que es el comportamiento deseado.
- Como no intenta eliminar el directorio de destino hasta después de haber eliminado su contenido, ahora debería estar vacío (aparte de cualquier cosa que también tenga manijas de archivos abiertos).
- Finalmente, utiliza
popd
para volver al directorio actual anterior y termina el guión.
(Si lo desea, puede comentar el guión con las descripciones anteriores utilizando rem
o ::
).