Eliminar todos los archivos de una carpeta y sus subcarpetas

52

Quiero eliminar todos los archivos de una estructura de carpetas, por lo que me queda una estructura de carpetas vacía.

¿Se puede lograr esto en scripting por lotes o VBScript ?

He intentado un comando por lotes muy básico, pero esto requirió que el usuario permitiera la eliminación de cada archivo. Esta no era una solución adecuada, ya que hay muchos cientos de archivos y esto aumentará enormemente con el tiempo.

¿Qué me puedes sugerir?

BobJim
fuente
¿Te refieres a una eliminación recursiva? De hecho, esto se puede hacer. Algo así rd /s /q "c:\folder ase realizará una eliminación recursiva en todos los archivos y carpetas dentroFolder A
Ramhound
Podría hacerlo, no sé cómo escribir en PowerShell, pero tengo secuencias de comandos de PowerShell anteriores.
BobJim
2
Ahora es un momento perfecto para aprender, investigaría la sintaxis de lotes y vbs para fines heredados, pero invertiría más tiempo en aprender PS.
MDMoore313
Todavía no he tenido la oportunidad de verificar el código, aunque estoy seguro de que funcionará. Volveré y seleccionaré la respuesta más adecuada a mi consulta inicial.
BobJim
Respaldaré la recomendación de @ BigHomie: acabo de aprender algo de PowerShell y debo decir que es bastante bueno, no demasiado difícil, una buena arma en el arsenal de cualquier programador. Lo uso con bastante frecuencia ahora.
Ben

Respuestas:

75

Esto se puede lograr usando PowerShell :

Get-ChildItem -Path C:\Temp -Include *.* -File -Recurse | foreach { $_.Delete()}

Este comando obtiene cada elemento secundario $path, ejecuta el método de eliminación en cada uno y es bastante rápido. La estructura de la carpeta se deja intacta.

Si puede tener archivos sin extensión, use

Get-ChildItem -Path C:\Temp -Include * -File -Recurse | foreach { $_.Delete()}

en lugar.

Parece que el -Fileparámetro puede haberse agregado después de PowerShell v2. Si ese es el caso, entonces

Get-ChildItem -Path C:\Temp -Include *.* -Recurse | foreach { $_.Delete()}

Debería hacer el truco para los archivos que tienen una extensión.

Si no funciona, verifique si tiene una versión actualizada de Powershell

MDMoore313
fuente
1
Es -Include *.*no -Include ., gran diferencia! :-)
MDMoore313
Get-ChildItem -Path D: \ EmptyThisFolder -Include . -Archivo -Recurso | foreach {$ _. Delete ()}
BobJim
¿Por qué estás usando -Include .? Ese es el problema.
MDMoore313
2
¿No pueden implementar powershell --version? ¿No pueden usar un número de versión con dígitos positivos? Es una locura. ¿Más de 1300 votos a favor para una pregunta sobre cómo encontrar el número de versión de un programa?
Thomas Weller el
1
@demonicdaron no debe hacerlo; La pregunta del OP fue para preservar la estructura de la carpeta.
MDMoore313
25

Corto y suite PowerShell. No estoy seguro de cuál será la versión más baja de PS con la que funcionará.

Remove-Item c:\Tmp\* -Recurse -Force
Evan Nadeau
fuente
2
Bonito y fácil. ¡Esto funcionó mientras que la respuesta aceptada no!
demonicdaron
Esta debería ser la respuesta aceptada, incluso puede simplemente escribir, rm *ya que no es realmente recomendable forzar (el diálogo de confirmación tiene una opción "Sí a todo" de todos modos).
J Garcia
22

Puedes hacerlo con el delcomando:

dir C:\folder
del /S *

El /Scambio es eliminar solo archivos de forma recursiva.

phoops
fuente
2
¿Esto solo eliminará archivos pero dejará las carpetas?
BobJim
55
Sí. Puede agregar la /Popción para que le pida que confirme cada eliminación solo para verificar eso.
phoops
gracias voy a intentarlo! ¡con suerte ahorrará mucho tiempo!
BobJim
3
Sí. Y para eliminar archivos ocultos y del sistema, hágalo attrib -s -r -h Folder\*.* /s /dantes de eliminar. Y para permisos use el takeowncomando.
Jet
2
Y puede usar / Q para NO pedir confirmación cuando use comodines.
Aylatan
4

Leyendo entre líneas en su pregunta original, puedo ofrecer una línea alternativa de código BATCH que puede usar. Lo que esto hará cuando se ejecute es solo eliminar archivos que tengan más de 60 días de antigüedad. De esta manera, puede poner esto en una tarea programada y cuando se ejecuta elimina los archivos sobrantes que no necesita en lugar de eliminar todo el directorio. Puede cambiar de 60 a 5 días o incluso 1 día si lo desea. Esto no elimina carpetas.

forfiles -p "c:\path\to\files" -d -60 -c "cmd /c del /f /q @path"
Travis
fuente
Gracias por la idea, pero actualmente creo que el proceso de "vaciado" se completará en un marco de tiempo ad hoc muy no programado. ¡Aunque conservaré ese código para el futuro! Saludos
BobJim
El título dice "Eliminar todos los archivos de una carpeta y sus subcarpetas", por lo que no es una solución.
Anders Lindén
4

Usando PowerShell:

Get-ChildItem -Path c:\temp -Include * | remove-Item -recurse 
Gregory Suvalian
fuente
3

Use PowerShell para eliminar un solo archivo o carpeta. Antes de ejecutar el comando Eliminar en powershell, debemos asegurarnos de que haya iniciado sesión en el servidor o PC con una cuenta que tenga acceso completo a los objetos que desea eliminar.

Con el ejemplo: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/

Uso de commnads de PowerShell para eliminar un archivo

Remove-Item -Path "C: \ dotnet-helpers \ DummyfiletoDelete.txt"

El comando anterior ejecutará y eliminará el archivo "DummyfiletoDelete.txt" que se encuentra dentro de la ubicación "C: \ dotnet-helpers".

Uso de commnads de PowerShell para eliminar todos los archivos

Remove-Item -Path "C: \ dotnet-helpers *. *"

Uso de commnads de PowerShell para eliminar todos los archivos y carpetas

Remove-Item -Path "C: \ dotnet-helpers *. *" -Recurse

-recurseprofundiza y encuentra muchos más archivos. El –recurseparámetro permitirá que PowerShell elimine cualquier elemento secundario sin pedir permiso. Además, el parámetro –force se puede agregar para eliminar archivos ocultos o de solo lectura.

Usando el comando -Force para eliminar archivos con fuerza

Uso del comando PowerShell para eliminar todos los archivos con fuerza

Remove-Item -Path "C: \ dotnet-helpers *. *" -Force

thiyagu selvaraj
fuente
1

Prueba esto usando PowerShell. En este ejemplo, quiero eliminar todos los archivos .class:

Get-ChildItem '.\FOLDERNAME' -include *.class -recurse | foreach ($_) {remove-item $_.FullName}
Boubakr
fuente
1
  1. En el Explorador de Windows, seleccione el directorio raíz que contiene todos los archivos y carpetas.

  2. Buscar *

  3. Ordenar por tipo (todas las carpetas estarán en la parte superior y todos los archivos enumerados debajo)

  4. Seleccione todos los archivos y presione Eliminar.

Esto eliminará todos los archivos y preservará la estructura del directorio.

Emel
fuente
1

Eliminar todos los archivos del directorio y subdirectorios actuales pero dejando la estructura de carpetas.

( /Q) el interruptor es para preguntar al usuario si está bien para eliminar

Precaución : pruébelo sin el /Qpara asegurarse de que no está eliminando nada valioso.

del /S * /Q 
hdoghmen
fuente
1

Esta es la forma más fácil de IMO

Abra PowerShell, navegue al directorio ( cd), LUEGO

ls -Recurse * | rm

(Poof) todo se ha ido ...

Si desea eliminar en función de una extensión específica

ls -Recurse *.docx | rm

ls está enumerando el directorio

-Recurse es una bandera que le dice a powershell que vaya a cualquier subdirectorio

* lo dice todo

*.doc todo con extensión .doc

| alimentar la salida de izquierda a derecha

rm borrar

Todas las otras respuestas parecen hacer esto más confuso de lo necesario.

Cañón Kolob
fuente
0
dir C:\testx\ -Recurse -File | rd -WhatIf
What if: Performing the operation "Remove File" on target "C:\testx\x.txt".
What if: Performing the operation "Remove File" on target "C:\testx\bla\x.txt".
bertieb
fuente
-1

Como complemento a las respuestas anteriores, en realidad no hay necesidad de usar Get-Childitem y pasar el resultado a la tubería en las respuestas anteriores, porque la palabra clave -Incluir está incluida en el comando Remove-Item

Uno puede simplemente:

Remove-Item -Include " . " "C: \ Temp" -Recurse

Sams0nT
fuente