remove force files delete contents batch all windows batch-file file-io cmd folder

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



remove file in windows cmd (15)

Esto eliminará las carpetas y archivos y dejará la carpeta atrás.

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)

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

Quiero eliminar todos los archivos y subcarpetas de este directorio, pero no el directorio en sí.

Pero, podría haber un error como ''este archivo / carpeta ya está en uso'' ... cuando eso sucede, solo debe continuar y omitir ese archivo / carpeta.

¿Alguien puede darme un comando para esto?


La solución más sencilla que se me ocurre es eliminar todo el directorio con

RD /S /Q folderPath

Luego creando este directorio de nuevo:

MD folderPath


Ninguna de las respuestas publicadas en 2018-06-01 con excepción de la línea de comandos única publicada por foxidrive realmente eliminó todos los archivos y todas las carpetas / directorios en %PathToFolder% . Esa es la razón para publicar una respuesta más con la línea de comando simple y simple 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 se publicaron el 2018-06-01 usando DEL y FOR with RD no pudo limpiar una carpeta completamente.

La solución simple de línea de comando que, por supuesto, también se puede utilizar 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 inserta la ruta del directorio actual en la pila y luego hace que %PathToFolder% el directorio actual para ejecutar el proceso del comando.

Esto funciona también para las rutas UNC de forma predeterminada porque las extensiones de comando están habilitadas de forma predeterminada y, en este caso, PUSHD crea una letra de unidad temporal que apunta al recurso de red especificado y luego cambia la unidad y el directorio actuales, utilizando la letra de unidad recién definida.

PUSHD emite el siguiente mensaje de error para manejar STDERR si el directorio especificado no existe en absoluto:

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 un directorio silenciosamente con todos los subdirectorios, incluso si el directorio especificado contiene archivos o carpetas con atributos ocultos o con un conjunto de atributos de solo lectura. El atributo del sistema nunca impide la eliminación de un archivo o carpeta.

No se eliminan son:

  1. Carpetas utilizadas como directorio actual para cualquier proceso en ejecución. El árbol de carpetas completo a dicha carpeta no se puede eliminar si una carpeta se utiliza 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 establecidos en el archivo abierto para evitar la eliminación del archivo mientras está abierto por la aplicación / proceso en ejecución. Dicho archivo abierto también evita la eliminación de todo el árbol de carpetas del archivo abierto.

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

El primer motivo para no eliminar una carpeta lo utiliza esta línea de comando para eliminar todos los archivos y subcarpetas de la carpeta especificada, pero no la carpeta en sí. La carpeta se convierte temporalmente en el directorio actual para ejecutar el proceso de comando, lo que impide 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 está siendo usado por otro proceso.

Archivo es el término incorrecto aquí, ya que en realidad la carpeta está siendo utilizada por otro proceso, el comando actual que ejecutó el comando RD . Bueno, en realidad, una carpeta es para el sistema de archivos un archivo especial con el directorio de atributos de archivo que explica este mensaje de error. Pero no quiero profundizar demasiado en la gestió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 identificador STDERR al dispositivo NUL .

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

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

Nota: POPD puede fallar silenciosamente al restaurar el directorio actual inicial en caso de que el directorio actual inicial fuera un subdirectorio del directorio para limpiar que ya no existe. En este caso especial, %PathToFolder% permanece en el directorio actual. Por lo tanto, es recomendable ejecutar la línea de comandos que se encuentra arriba, no desde un subdirectorio de %PathToFolder% .

Un dato más interesante :
También probé la línea de comandos usando una ruta UNC compartiendo el directorio local C:/Temp con el nombre de Temp y utilizando la ruta UNC //%COMPUTERNAME%/Temp/CleanTest asignado a la variable de entorno PathToFolder en Windows 7. Si el directorio actual está en ejecución la línea de comandos es un subdirectorio de la carpeta local compartida a la que se accede mediante la ruta UNC, es decir, C:/Temp/CleanTest/Subfolder1 , la Subfolder1 se elimina por RD y el siguiente POPD falla silenciosamente al hacer que C:/Temp/CleanTest/Subfolder1 vuelva a ser el directorio actual dando como resultado que Z:/CleanTest permanezca como directorio actual para el proceso de comando en ejecución. Entonces, en este caso muy especial, la letra de la unidad temporal permanece hasta que el directorio actual se cambia, por ejemplo, con cd /D %SystemRoot% a un directorio local realmente existente. Desafortunadamente, 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 salir del código de POPD . Sin embargo, se puede suponer que nadie se topa con este caso de error tan especial, ya que las rutas UNC generalmente no se usan para acceder a los archivos y carpetas locales.

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

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

Una línea con varios comandos utilizando el archivo por lotes de Windows explica los operadores && y & utilizados aquí.

A continuación, veamos la solución de archivos por lotes con 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.

Importantes 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 utiliza 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 atributos ocultos, que EL 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 realmente se deben eliminar múltiples archivos.
  • >nul es necesario para redirigir la salida de los nombres de archivo escritos para manejar STDOUT al dispositivo NUL que no se puede eliminar porque el archivo está actualmente abierto o el usuario no tiene permiso para eliminar el archivo.
  • 2>nul es necesario para redireccionar la salida del mensaje de error para cada archivo que no se puede eliminar desde el identificador 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 usa porque FOR ignora los subdirectorios con el conjunto de atributos ocultos. Por esa razón, for /F se utiliza para ejecutar la siguiente línea de comandos en un proceso de comando separado iniciado en segundo plano con cmd.exe /C :

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

Las salidas de DIR en formato simple debido a /B las entradas de directorio con el atributo D , es decir, los nombres de todos los subdirectorios en el directorio especificado, independientes en otros atributos como atributo oculto sin ruta. 2>nul se usa para redireccionar la salida del mensaje de error por DIR en ningún directorio encontrado desde el identificador STDERR al dispositivo NUL .

El operador de redireccionamiento > debe escaparse con el carácter de intercalación ^ en la línea de comando FOR para que se interprete como un 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 dir integrada en un proceso de comando separado iniciado en segundo plano.

FOR procesa la salida capturada escrita para manejar STDOUT del proceso de comando iniciado, que son los nombres de los subdirectorios sin ruta y nunca entre comillas dobles.

FOR con opción /F ignora las líneas vacías que no aparecen aquí, ya que DIR con 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 de fin de línea predeterminado. 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 el 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 utilizando espacio y tabulación horizontal como delimitadores y asignaría solo la primera secuencia delimitada por espacio / tabulador a la variable de bucle especificada I 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íneas y asignarse a la variable de bucle I siempre el nombre completo del directorio.

El comando FOR ejecuta el comando RD para cada nombre de directorio sin ruta, 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 los siguientes comandos y lea todas las páginas de ayuda que se muestran con mucho cuidado.

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?

Para borrar el archivo:

del PATH_TO_FILE

Para eliminar la carpeta con todos los archivos en ella:

rmdir /s /q PATH_TO_FOLDER

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

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


Probé 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.


Puede hacerlo usando el siguiente comando para eliminar todos los contenidos y la carpeta principal:

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


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

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

Cree un archivo de proceso 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


RD significa eliminar directorio.

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

/ Q: silencioso - no mostrar la confirmación de YN

Ejemplo:

RD /S /Q C:/folder_path/here


Use el bloc de notas para crear un documento de texto y copie / pegue esto:

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), simplemente ejecútalo. Yo uso la variable temporal en este ejemplo, ¡pero puedes usar cualquier otra! ps Para el sistema operativo Windows solamente!


Yo uso Powershell

Remove-Item c:/scripts/* -recurse

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


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.


@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í.


@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


CD [Your_Folder] RMDIR /S /Q .

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

Actualización :

A partir de this ú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 de directorio mal escrito):

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

Desde la referencia de línea de comandos de Windows :

/ 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.)


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

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