Usuń wszystkie pliki z folderu i jego podfolderów

52

Chcę usunąć wszystkie pliki ze struktury folderów, więc mam pustą strukturę folderów.

Czy można to osiągnąć za pomocą skryptów wsadowych lub skryptów VBScript ?

Próbowałem bardzo podstawowej komendy wsadowej, ale wymagało to od użytkownika usunięcia każdego pliku. Nie było to odpowiednie rozwiązanie, ponieważ istnieje wiele setek plików, które z czasem znacznie wzrosną.

Co możesz zasugerować

BobJim
źródło
Masz na myśli usunięcie rekurencyjne? Rzeczywiście można to zrobić. Coś takiego rd /s /q "c:\folder awykona rekurencyjne usuwanie wszystkich plików i folderów wFolder A
Ramhound 15.04. Kwietnia
Mógłbym zrobić, nie wiem jak pisać w PowerShell, ale miałem wcześniej uruchomione skrypty PowerShell.
BobJim
2
Teraz jest idealny czas na naukę. Chciałbym zbadać składnię wsadową i vbs dla starszych celów, ale poświęcić więcej czasu na naukę PS.
MDMoore313
Nie miałem jeszcze okazji sprawdzić kodu, chociaż jestem pewien, że zadziała. Wrócę i wybiorę najbardziej odpowiednią odpowiedź na moje pierwsze zapytanie.
BobJim
Popieram zalecenie @ BigHomie - właśnie nauczyłem się PowerShell i muszę powiedzieć, że jest całkiem fajny - niezbyt twardy, dobra broń w arsenale każdego programisty. Używam go teraz dość często.
Ben,

Odpowiedzi:

75

Można to osiągnąć za pomocą programu PowerShell :

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

To polecenie pobiera każdy element podrzędny $path, wykonuje na każdym z nich metodę usuwania i jest dość szybkie. Struktura folderów pozostaje nienaruszona.

Jeśli możesz mieć pliki bez rozszerzenia, użyj

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

zamiast.

Wygląda na to, że -Fileparametr mógł zostać dodany po PowerShell v2. Jeśli tak jest w takim przypadku

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

To powinno załatwić sprawę w przypadku plików z rozszerzeniem.

Jeśli to nie działa, sprawdź, czy masz aktualną wersję programu PowerShell

MDMoore313
źródło
1
To -Include *.*nie jest -Include .duża różnica! :-)
MDMoore313
Get-ChildItem -Path D: \ EmptyThisFolder -Include . -File -Recurse | foreach {$ _. Delete ()}
BobJim
Dlaczego używasz -Include .? Na tym polega problem.
MDMoore313,
2
Czy nie mogą wdrożyć powershell --version? Czy nie mogą używać numeru wersji z cyframi dodatnimi? To jest po prostu szalone. Ponad 1300 głosów pozytywnych na pytanie, jak znaleźć numer wersji programu?
Thomas Weller,
1
@demonicdaron nie powinien; Pytanie OP dotyczyło zachowania struktury folderów.
MDMoore313,
25

Krótki i pakiet PowerShell. Nie jestem pewien, z jaką najniższą wersją PS będzie współpracować.

Remove-Item c:\Tmp\* -Recurse -Force
Evan Nadeau
źródło
2
Miło i łatwo. To załatwiło sprawę, a zaakceptowana odpowiedź nie!
demonicdaron
To powinna być zaakceptowana odpowiedź, możesz nawet po prostu wpisać, rm *ponieważ tak naprawdę nie jest zalecane wymuszanie (okno dialogowe potwierdzenia ma opcję „Tak dla wszystkich”).
J Garcia
22

Możesz to zrobić za pomocą delpolecenia:

dir C:\folder
del /S *

/SPrzełącznik jest usunięcie tylko pliki rekurencyjnie.

phoops
źródło
2
Czy to tylko usunie pliki, ale opuści foldery?
BobJim
5
Tak. Możesz dodać /Popcję, aby poprosić o potwierdzenie każdego usunięcia, aby to sprawdzić.
phoops
dzięki, niech spróbuje! mam nadzieję, że zaoszczędzi mnóstwo czasu!
BobJim
3
Tak. Aby usunąć ukryte i systemowe pliki, wykonaj to attrib -s -r -h Folder\*.* /s /dprzed usunięciem. Aby uzyskać uprawnienia, użyj takeownpolecenia.
Jet
2
I możesz użyć / Q, aby NIE prosić o potwierdzenie podczas używania symboli wieloznacznych.
Aylatan
4

Czytając między wierszami twojego pierwotnego pytania, mogę zaoferować alternatywną linię kodu BATCH, której możesz użyć. Po uruchomieniu uruchomione zostaną tylko te pliki, które mają ponad 60 dni. W ten sposób możesz umieścić to w zaplanowanym zadaniu, a po uruchomieniu usuwa niepotrzebne pliki zamiast wysadzać cały katalog. Możesz zmienić od 60 do 5 dni, a nawet 1 dzień, jeśli chcesz. To nie usuwa folderów.

forfiles -p "c:\path\to\files" -d -60 -c "cmd /c del /f /q @path"
Travis
źródło
Dzięki za pomysł, ale obecnie myślę, że proces „opróżniania” zostanie zakończony w bardzo nieplanowanym terminie adhoc. Zachowam ten kod na przyszłość! Pozdrawiam
BobJim
Tytuł brzmi „Usuń wszystkie pliki z folderu i jego podfolderów”, więc nie jest to rozwiązanie.
Anders Lindén,
4

Za pomocą programu PowerShell:

Get-ChildItem -Path c:\temp -Include * | remove-Item -recurse 
Gregory Suvalian
źródło
3

Użyj programu PowerShell, aby usunąć pojedynczy plik lub folder. Przed wykonaniem polecenia Usuń w programie PowerShell musimy upewnić się, że jesteś zalogowany na serwerze lub komputerze za pomocą konta, które ma pełny dostęp do obiektów, które chcesz usunąć.

Z przykładem: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/

Użycie komend PowerShell do usunięcia pliku

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

Powyższe polecenie wykona i usunie plik „DummyfiletoDelete.txt” znajdujący się w lokalizacji „C: \ dotnet-helpers”.

Używanie komend PowerShell do usuwania wszystkich plików

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

Używanie komend PowerShell do usuwania wszystkich plików i folderów

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

-recursedrąży i znajduje o wiele więcej plików. Ten –recurseparametr pozwoli PowerShellowi usunąć wszelkie elementy potomne bez pytania o zgodę. Dodatkowo można dodać parametr –force, aby usunąć pliki ukryte lub tylko do odczytu.

Używanie polecenia -Force do wymuszonego usuwania plików

Za pomocą polecenia PowerShell, aby wymusić usunięcie wszystkich plików

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

thiyagu selvaraj
źródło
1

Wypróbuj za pomocą PowerShell. W tym przykładzie chcę usunąć wszystkie pliki .class:

Get-ChildItem '.\FOLDERNAME' -include *.class -recurse | foreach ($_) {remove-item $_.FullName}
Boubakr
źródło
1
  1. W Eksploratorze Windows wybierz katalog główny zawierający wszystkie pliki i foldery.

  2. Szukać *

  3. Sortuj według typu (wszystkie foldery będą na górze, a wszystkie pliki wymienione poniżej)

  4. Wybierz wszystkie pliki i naciśnij klawisz Delete.

Spowoduje to usunięcie wszystkich plików i zachowanie struktury katalogów.

Emel
źródło
1

Usuń wszystkie pliki z bieżącego katalogu i podkatalogów, ale pozostawiając strukturę folderów.

( /Q) służy do pytania użytkownika, czy jest w porządku, aby go usunąć

Uwaga : wypróbuj to bez /Qupewnienia się, że nie usuwasz niczego cennego.

del /S * /Q 
hdoghmen
źródło
1

To najprostszy sposób IMO

Otwórz PowerShell, przejdź do katalogu ( cd), NASTĘPNIE

ls -Recurse * | rm

(Poof) wszystko zniknęło ...

Jeśli chcesz usunąć na podstawie określonego rozszerzenia

ls -Recurse *.docx | rm

ls wyświetla katalog

-Recurse jest flagą informującą PowerShell do przechodzenia do dowolnych podkatalogów

* mówi wszystko

*.doc wszystko z rozszerzeniem .doc

| podaj dane wyjściowe od lewej do prawej

rm kasować

Wszystkie pozostałe odpowiedzi sprawiają, że jest to bardziej mylące niż to konieczne.

Kanion Kolob
źródło
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
źródło
-1

Jako uzupełnienie powyższych odpowiedzi, w rzeczywistości nie ma potrzeby używania Get-Childitem i przekazywania wyniku do potoku w powyższych odpowiedziach, ponieważ słowo kluczowe -Include jest zawarte w poleceniu Remove-Item

Można po prostu:

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

Sams0nT
źródło