Cómo eliminar archivos / subcarpetas en un directorio específico en el símbolo del sistema en Windows

Diga, hay una variable llamada %pathtofolder% , ya que deja en claro que es una ruta completa de una carpeta.

Quiero eliminar cada archivo y subcarpeta de este directorio, pero no el directorio en sí.

Pero puede haber un error como ‘este archivo / carpeta ya está en uso’ … cuando eso suceda, debería continuar y omitir ese archivo / carpeta.

¿Alguien puede darme un poco de comando para esto?

Puede usar este script de shell para limpiar la carpeta y los archivos dentro de la fuente C:\Temp :

 del /q "C:\Temp\*" FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q 

Cree un archivo por lotes (por ejemplo, delete.bat) que contenga el comando anterior. Vaya a la ubicación donde se encuentra el archivo delete.bat y luego ejecute el comando: delete.bat

rmdir es mi comando favorito de todos los tiempos para el trabajo. Funciona para eliminar grandes archivos y carpetas con subcarpetas. No se crea una copia de seguridad, así que asegúrese de haber copiado sus archivos de forma segura antes de ejecutar este comando.

 RMDIR "FOLDERNAME" /S /Q 

Esto elimina silenciosamente la carpeta y todos los archivos y subcarpetas.

La solución más simple que puedo pensar es eliminar todo el directorio con

 RD /S /Q folderPath 

Luego creando este directorio nuevamente:

 MD folderPath 

Esto eliminará las carpetas y archivos y abandonará la carpeta.

 pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd) 
 @ECHO OFF Set dir=path-to-dir Echo Deleting all files from %dir% del %dir%\* /F /Q Echo Deleting all folders from %dir% for /d %%p in (%dir%\*) Do rd /Q /S "%%p" @echo Folder deleted. exit 

… elimina todos los archivos y carpetas debajo del directorio dado, pero no el directorio en sí.

 CD [Your_Folder] RMDIR /S /Q . 

Aparecerá un mensaje de error que indica que el comando RMDIR no puede acceder a la carpeta actual, por lo que no puede eliminarla.

Actualización :

A partir de este útil comentario (gracias a Moritz Both ), puede agregar && between, por lo que RMDIR no se ejecutará si falla el comando del CD (por ejemplo, el nombre del directorio mal escrito):

 CD [Your_Folder] && RMDIR /S /Q . 

Desde la línea de comandos de Windows Referencia :

/ S: elimina un árbol de directorios (el directorio especificado y todos sus subdirectorios, incluidos todos los archivos).

/ Q: especifica el modo silencioso. No solicita confirmación al eliminar un árbol de directorios. (Tenga en cuenta que / q funciona solo si se especifica / s).

RD significa REMOVE Directory.

/ S: elimine todos los archivos y subcarpetas además de la carpeta misma. Use esto para eliminar un árbol de carpetas completo.

/ Q: Silencio: no muestra la confirmación YN

Ejemplo:

 RD /S /QC:/folder_path/here 

Yo uso Powershell

 Remove-Item c:\scripts\* -recurse 

Eliminará el contenido de la carpeta, no la carpeta en sí.

Use el bloc de notas para crear un documento de texto y copiarlo / pegarlo:

 rmdir /s/q "%temp%" mkdir "%temp%" 

Seleccione guardar como, Nombre de archivo:

delete_temp.bat

Guardar como tipo: todos los archivos y haga clic en el botón Guardar.

Trabaja en cualquier tipo de cuenta (administrador o usuario estándar), ¡solo ejecútalo! Utilizo la variable temp en este ejemplo, ¡pero puede usar cualquier otra! ¡solo para SO Windows!

Puede hacerlo utilizando el siguiente comando para eliminar todo el contenido y la carpeta principal en sí:

 RMDIR [/S] [/Q] [drive:]path 

Para eliminar el archivo:

 del PATH_TO_FILE 

Para eliminar una carpeta con todos los archivos:

 rmdir /s /q PATH_TO_FOLDER 

Eliminar todos los archivos de una carpeta específica (sin eliminar la carpeta) es un poco complicado. del /s *.* no puede eliminar carpetas, pero elimina archivos de todas las subcarpetas. Entonces se necesitan dos comandos:

 del /q PATH_TO_FOLDER\*.* for /d %i in (PATH_TO_FOLDER\*.*) do @rmdir /s /q "%i" 

Ninguna de las respuestas publicadas en 2018-06-01 con excepción de la línea de comando publicada por foxidrive borró realmente todos los archivos y todas las carpetas / directorios en %PathToFolder% . Esa es la razón para publicar una respuesta más con la simple línea de comando única para eliminar todos los archivos y subcarpetas de una carpeta, así como un archivo por lotes con una solución más compleja que explica por qué todas las demás respuestas publicadas en 2018-06-01 utilizando DEL y FOR con RD no pudo limpiar completamente una carpeta.


La solución simple de línea de comando que, por supuesto, también se puede usar en un archivo por lotes:

 pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd ) 

Esta línea de comando contiene tres comandos ejecutados uno después del otro.

El primer comando PUSHD empuja la ruta del directorio actual en la stack y luego hace que %PathToFolder% el directorio actual para ejecutar el proceso de comando.

Esto funciona también para rutas UNC por defecto porque las extensiones de comando están habilitadas por defecto y en este caso PUSHD crea una letra de unidad temporal que apunta a ese recurso de red especificado y luego cambia la unidad y el directorio actuales, usando la letra de unidad recientemente definida.

PUSHD genera el siguiente mensaje de error para manejar STDERR si el directorio especificado no existe:

El sistema no puede encontrar la ruta especificada.

Este mensaje de error se suprime redirigiéndolo con 2>nul al dispositivo NUL .

El siguiente comando RD se ejecuta solo si el cambio del directorio actual para el proceso de comando actual al directorio especificado fue exitoso, es decir, el directorio especificado existe.

El comando RD con las opciones /Q y /S elimina silenciosamente un directorio con todos los subdirectorios, incluso si el directorio especificado contiene archivos o carpetas con atributo oculto o con conjunto de atributos de solo lectura. El atributo del sistema nunca evita la eliminación de un archivo o carpeta.

No eliminados son:

  1. Carpetas utilizadas como directorio actual para cualquier proceso en ejecución. El árbol de carpetas completo para dicha carpeta no se puede eliminar si se utiliza una carpeta como directorio actual para cualquier proceso en ejecución.

  2. Archivos abiertos actualmente por cualquier proceso en ejecución con permisos de acceso a archivos configurados en archivos abiertos para evitar la eliminación del archivo mientras se abre por la aplicación / proceso en ejecución. Tal archivo abierto también evita la eliminación de todo el árbol de carpetas en el archivo abierto.

  3. Archivos / carpetas en los que el usuario actual no tiene los permisos necesarios (NTFS) para eliminar el archivo o la carpeta, lo que también impide la eliminación del árbol de carpetas en este archivo / carpeta.

La primera razón para no eliminar una carpeta es utilizada por esta línea de comando para eliminar todos los archivos y subcarpetas de la carpeta especificada, pero no la carpeta misma. La carpeta se convierte temporalmente en el directorio actual para ejecutar el proceso de comando, lo que evita la eliminación de la carpeta. Por supuesto, esto da como resultado la salida de un mensaje de error por el comando RD :

El proceso no puede acceder al archivo porque lo está usando otro proceso.

Archivo es el término incorrecto aquí, ya que en realidad la carpeta está siendo utilizada por otro proceso, el proceso de comando actual que ejecuta el comando RD . Bueno, en realidad, una carpeta es para el sistema de archivos un archivo especial con un directorio de atributos de archivo que explica este mensaje de error. Pero no quiero profundizar en la administración del sistema de archivos.

Este mensaje de error, como todos los demás mensajes de error, que podría ocurrir debido a los tres motivos escritos anteriormente, se suprime redirigiéndolo con 2>nul desde el controlador STDERR al dispositivo NUL .

El tercer comando POPD se ejecuta de forma independiente en el valor de salida del comando RD .

POPD muestra la ruta del directorio empujada por PUSHD desde la stack y cambia el directorio actual para ejecutar el proceso de comando a este directorio, es decir, restaura el directorio actual inicial. POPD elimina la letra de unidad temporal creada por PUSHD en el caso de una ruta de carpeta UNC.

Nota: POPD puede fallar silenciosamente para restaurar el directorio actual inicial en el caso de que el directorio actual inicial fuera un subdirectorio del directorio para limpiar que ya no existe. En este caso especial %PathToFolder% sigue siendo el directorio actual. Por lo tanto, es aconsejable ejecutar la línea de comando anterior no desde un subdirectorio de %PathToFolder% .

Un hecho más interesante :
Probé la línea de comandos también usando una ruta UNC compartiendo el directorio local C:\Temp con el nombre compartido Temp y usando la ruta UNC \\%COMPUTERNAME%\Temp\CleanTest asignado a la variable de entorno PathToFolder en Windows 7. Si el directorio actual se está ejecutando la línea de comando es un subdirectorio de la carpeta local compartida a la que se accede usando la ruta UNC, es decir, C:\Temp\CleanTest\Subfolder1 , RD borra la Subfolder1 y la siguiente POPD falla silenciosamente al hacer C:\Temp\CleanTest\Subfolder1 nuevamente el directorio actual lo que resulta en Z:\CleanTest restante como directorio actual para el proceso de comando en ejecución. Por lo tanto, en este caso muy, muy especial, la letra de la unidad temporal permanece hasta que se cambie el directorio actual, por ejemplo, con cd /D %SystemRoot% a un directorio local realmente existente. Lamentablemente, POPD no sale con un valor mayor a 0 si no puede restaurar el directorio actual inicial, lo que hace imposible detectar esta condición de error muy especial con solo el código de salida de POPD . Sin embargo, se puede suponer que nadie se topa con este caso de error muy especial, ya que las rutas UNC generalmente no se utilizan para acceder a archivos y carpetas locales.

Para comprender aún mejor los comandos utilizados, abra una ventana del símbolo del sistema, ejecute allí los siguientes comandos y lea la ayuda mostrada para cada comando con mucho cuidado.

  • pushd /?
  • popd /?
  • rd /?

Una sola línea con múltiples comandos usando el archivo por lotes de Windows explica los operadores && y & usados ​​aquí.


A continuación, veamos la solución de archivo por lotes utilizando el comando DEL para eliminar archivos en %PathToFolder% y FOR y RD para eliminar las subcarpetas en %PathToFolder% .

 @echo off setlocal EnableExtensions DisableDelayedExpansion rem Clean the folder for temporary files if environment variable rem PathToFolder is not defined already outside this batch file. if not defined PathToFolder set "PathToFolder=%TEMP%" rem Remove all double quotes from folder path. set "PathToFolder=%PathToFolder:"=%" rem Consisted the folder path only of double quotes? if not defined PathToFolder goto EndCleanFolder rem Remove a backslash at end of folder path. if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%" rem Consisted folder path only of a backslash (with one or more double quotes)? if not defined PathToFolder goto EndCleanFolder rem Delete all files in specified folder including files with hidden rem or read-only attribute set, except the files currently opened by rem a running process which prevents deletion of the file while being rem opened by the application, or on which the current user has not rem the required permissions to delete the file. del /A /F /Q "%PathToFolder%\*" >nul 2>nul rem Delete all subfolders in specified folder including those with hidden rem attribute set recursive with all files and subfolders, except folders rem being the current directory of any running process which prevents the rem deletion of the folder and all folders above, folders containing a file rem opened by the application which prevents deletion of the file and the rem entire folder structure to this file, or on which the current user has rem not the required permissions to delete a folder or file in folder tree rem to delete. for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul :EndCleanFolder endlocal 

El archivo por lotes primero se asegura de que la variable de entorno PathToFolder esté realmente definida con una ruta de carpeta sin comillas dobles y sin una barra invertida al final. La barra invertida al final no sería un problema, pero las comillas dobles en la ruta de la carpeta podrían ser problemáticas debido a que el valor de PathToFolder se concatena con otras cadenas durante la ejecución del archivo por lotes.

Importante son las dos líneas:

 del /A /F /Q "%PathToFolder%\*" >nul 2>nul for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul 

El comando DEL se usa para eliminar todos los archivos en el directorio especificado.

  • La opción /A es necesaria para procesar realmente todos los archivos, incluidos los archivos con atributo oculto que DEL ignoraría sin usar la opción /A
  • La opción /F es necesaria para forzar la eliminación de archivos con un conjunto de atributos de solo lectura.
  • La opción /Q es necesaria para ejecutar una eliminación silenciosa de varios archivos sin /Q al usuario si se deben eliminar realmente varios archivos.
  • >nul es necesario para redirigir el resultado de los nombres de archivo escritos para manejar STDOUT al dispositivo NUL del cual no se puede eliminar debido a que el archivo está actualmente abierto o el usuario no tiene permiso para eliminar el archivo.
  • 2>nul es necesario para redirigir la salida del mensaje de error para cada archivo que no se puede eliminar desde el controlador STDERR al dispositivo NUL .

Los comandos FOR y RD se utilizan para eliminar todos los subdirectorios en el directorio especificado. Pero for /D no se utiliza porque FOR ignora los subdirectorios con conjunto de atributos ocultos. Por ese motivo, for /F se usa para ejecutar la siguiente línea de comando en un proceso de comando separado iniciado en segundo plano con cmd.exe /C :

 dir "%PathToFolder%\*" /AD /B 2>nul 

DIR produce en formato desnudo debido a /B las entradas de directorio con el atributo D , es decir, los nombres de todos los subdirectorios en el directorio especificado son independientes de otros atributos, como el atributo oculto sin ruta. 2>nul se usa para redirigir el mensaje de error generado por DIR en ningún directorio encontrado desde el controlador STDERR al dispositivo NUL .

El operador de redirección > debe ser escapado con carácter de carácter ^ en la línea de comandos FOR para interpretarlo como carácter literal cuando el intérprete de comandos de Windows procesa esta línea de comando antes de ejecutar el comando FOR que ejecuta la línea de comando del comando incrustado en un proceso de comando separado iniciado en segundo plano.

FOR procesa el resultado capturado escrito para manejar STDOUT del proceso de comando iniciado, que son los nombres de los subdirectorios sin ruta y nunca se incluyen entre comillas dobles.

FOR con la opción /F ignora las líneas vacías que no aparecen aquí ya que DIR con la opción /B no genera líneas vacías.

FOR también ignoraría las líneas que comienzan con un punto y coma que es el carácter predeterminado de fin de línea. Un nombre de directorio puede comenzar con un punto y coma. Por eso eol=| se utiliza para definir el carácter de barra vertical como carácter de final de línea que ningún directorio o archivo puede tener en su nombre.

FOR dividiría la línea en subcadenas usando el espacio y la pestaña horizontal como delimitadores y asignaría solo la primera cadena delimitada por espacio / tabulación a la variable de bucle I especificada. Este comportamiento de división no se desea aquí porque un nombre de directorio puede contener uno o más espacios. Por delims= tanto, delims= se usa para definir una lista vacía de delimitadores para deshabilitar el comportamiento de división de línea y obtener asignada a la variable de bucle I siempre el nombre completo del directorio.

Command FOR ejecuta el comando RD para cada nombre de directorio sin ruta, que es la razón por la cual en la línea de comandos de RD la ruta de la carpeta debe especificarse una vez más, que se concatena con el nombre de la subcarpeta.

Para comprender los comandos utilizados y cómo funcionan, abra una ventana de símbolo del sistema, ejecute allí los siguientes comandos y lea con atención todas las páginas de ayuda que se muestran para cada comando.

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?
 @ECHO OFF rem next line removes all files in temp folder DEL /A /F /Q /S "%temp%\*.*" rem next line cleans up the folder's content FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q 

Intenté varios de estos enfoques, pero ninguno funcionó correctamente.
Encontré este enfoque de dos pasos en la línea de comandos de Windows del sitio:

 forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file" forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file" 

Funcionó exactamente como lo necesitaba y según lo especificado por el OP.

 del %pathtofolder%\*.* /s /f /q 

elimine todos los archivos y subcarpetas en% pathtofolder%, incluidos los archivos de solo lectura, no solicite confirmación