Elimina tutti i file da una cartella e dalle sue sottocartelle


52

Voglio rimuovere tutti i file da una struttura di cartelle, quindi mi rimane una struttura di cartelle vuota.

Ciò può essere ottenuto in batch o script VBScript ?

Ho provato un comando batch molto semplice, ma ciò ha richiesto all'utente di consentire l'eliminazione di ogni file. Questa non era una soluzione adatta in quanto ci sono molte centinaia di file e questo aumenterà notevolmente nel tempo.

Cosa puoi suggerire?


Intendi una cancellazione ricorsiva? Questo può davvero essere fatto. Qualcosa del genere rd /s /q "c:\folder aeseguirà Folder A
un'eliminazione

Potrei farlo, non so come scrivere script in PowerShell ma ho script PowerShell precedenti.
BobJim

2
Ora è il momento perfetto per imparare, vorrei ricercare la sintassi batch e vbs per scopi legacy, ma investendo più tempo nell'apprendimento del PS.
MDMoore313,

Non ho ancora avuto la possibilità di controllare il codice, anche se sono sicuro che funzionerà. Tornerò e selezionerò la risposta più appropriata alla mia domanda iniziale.
BobJim

Seguirò la raccomandazione di @ BigHomie: ho appena imparato un po 'di PowerShell e devo dire che è abbastanza pulito, non troppo difficile, una buona arma nell'arsenale di qualsiasi programmatore. Lo uso abbastanza frequentemente ora.
Ben

Risposte:


75

Questo può essere realizzato usando PowerShell :

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

Questo comando inserisce ogni elemento figlio $path, esegue il metodo di eliminazione su ciascuno ed è abbastanza veloce. La struttura delle cartelle rimane intatta.

Se potresti avere file senza estensione, usa

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

anziché.

Sembra che il -Fileparametro potrebbe essere stato aggiunto dopo PowerShell v2. Se è così, allora

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

Dovrebbe fare il trucco per i file che hanno un'estensione.

Se non funziona, controlla se disponi di una versione aggiornata di Powershell


1
E ' -Include *.*non è -Include ., grande differenza! :-)
MDMoore313

Get-ChildItem -Path D: \ EmptyThisFolder -Include . -File -Recurse | foreach {$ _. Delete ()}
BobJim

Perché stai usando -Include .?? Questo è il problema.
MDMoore313,

2
Non possono implementare powershell --version? Non possono usare un numero di versione con cifre positive? È solo pazzo. Più di 1300 voti per una domanda su come scoprire un numero di versione di un programma?
Thomas Weller,

1
@demonicdaron non dovrebbe; La domanda dell'OP era per preservare la struttura delle cartelle.
MDMoore313,

25

Breve e suite PowerShell. Non sono sicuro di quale versione più bassa di PS funzionerà.

Remove-Item c:\Tmp\* -Recurse -Force

2
Bello e facile. Questo ha funzionato, mentre la risposta accettata no!
demonicdaron,

Questa dovrebbe essere la risposta accettata, puoi anche solo digitare rm *poiché non è davvero consigliabile forzare (la finestra di dialogo di conferma ha comunque l'opzione "Sì a tutti").
J Garcia,

22

Puoi farlo con il delcomando:

dir C:\folder
del /S *

L' /Sopzione è di eliminare solo i file in modo ricorsivo.


2
Questo eliminerà solo i file ma lascerà le cartelle?
BobJim

5
Sì. Puoi aggiungere /Pun'opzione in modo che ti chieda di confermare ogni cancellazione solo per controllarla.
phoops,

grazie ill provaci! si spera risparmierà un sacco di tempo!
BobJim

3
Sì. E per eliminare i file nascosti e di sistema, esegui attrib -s -r -h Folder\*.* /s /dprima di eliminare. E per i permessi usa il takeowncomando.
Jet

2
E puoi usare / Q per NON chiedere conferma quando usi i caratteri jolly.
Aylatan,

4

Leggendo tra le righe della tua domanda originale, posso offrire una riga di codice BATCH alternativa che puoi utilizzare. Ciò che farà quando viene eseguito è solo eliminare i file che hanno più di 60 giorni. In questo modo è possibile inserirlo in un'attività pianificata e quando viene eseguito elimina i file in eccesso che non sono necessari anziché eliminare l'intera directory. Puoi cambiare da 60 a 5 giorni o anche 1 giorno se lo desideri. Questo non elimina le cartelle.

forfiles -p "c:\path\to\files" -d -60 -c "cmd /c del /f /q @path"

Grazie per l'idea, ma attualmente penso che il processo di "svuotamento" sarà completato in un lasso di tempo ad hoc molto non programmato. Terrò quel codice per il futuro però! Saluti
BobJim

Il titolo dice "Elimina tutti i file da una cartella e dalle sue sottocartelle", quindi questa non è una soluzione.
Anders Lindén,

4

Utilizzando PowerShell:

Get-ChildItem -Path c:\temp -Include * | remove-Item -recurse 

3

Utilizzare PowerShell per eliminare un singolo file o cartella. Prima di eseguire il comando Elimina in PowerShell, è necessario assicurarsi di aver effettuato l'accesso al server o al PC con un account che abbia pieno accesso agli oggetti che si desidera eliminare.

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

Utilizzo dei comandi PowerShell per eliminare un file

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

Il comando sopra eseguirà ed eliminerà il file “DummyfiletoDelete.txt” presente all'interno della posizione “C: \ dotnet-helpers”.

Utilizzo dei comandi PowerShell per eliminare tutti i file

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

Utilizzo dei comandi PowerShell per eliminare tutti i file e le cartelle

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

-recurseesegue il drill down e trova molti più file. Il –recurseparametro consentirà a PowerShell di rimuovere tutti gli elementi figlio senza chiedere l'autorizzazione. Inoltre, è possibile aggiungere il parametro –force per eliminare i file nascosti o di sola lettura.

Utilizzo del comando -Force per eliminare forzatamente i file

Utilizzo del comando PowerShell per eliminare tutti i file in modo forzato

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


1

Prova questo usando PowerShell. In questo esempio voglio eliminare tutti i file .class:

Get-ChildItem '.\FOLDERNAME' -include *.class -recurse | foreach ($_) {remove-item $_.FullName}

1
  1. In Esplora risorse selezionare la directory principale contenente tutti i file e le cartelle.

  2. Cercare *

  3. Ordina per tipo (tutte le cartelle saranno in alto e tutti i file elencati sotto)

  4. Seleziona tutti i file e premi Elimina.

Ciò eliminerà tutti i file e preserverà la struttura della directory.


1

Elimina tutti i file dalla directory e dalle sottodirectory correnti ma lasciando la struttura delle cartelle.

( /Q) switch è per chiedere all'utente se è ok per eliminare

Attenzione : provalo senza /Qper accertarti di non eliminare nulla di prezioso.

del /S * /Q 

1

Questo è il modo più semplice IMO

Apri PowerShell, vai alla directory ( cd), POI

ls -Recurse * | rm

(Poof) tutto è andato ...

Se si desidera eliminare in base a un'estensione specifica

ls -Recurse *.docx | rm

ls sta elencando la directory

-Recurse è una bandiera che dice a PowerShell di entrare in qualsiasi sottodirectory

* dice tutto

*.doc tutto con estensione .doc

| alimentare l'output da sinistra a destra

rm Elimina

Tutte le altre risposte sembrano rendere questo più confuso del necessario.


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".

-1

A complemento delle risposte di cui sopra, in realtà non è necessario utilizzare Get-Childitem e passare il risultato alla pipeline nelle risposte di cui sopra, poiché la parola chiave -Include è inclusa nel comando Rimuovi-elemento

Si può semplicemente:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.