Jaki jest najprostszy sposób, aby wymusić usunięcie katalogu i wszystkich jego podkatalogów w PowerShell? Korzystam z programu PowerShell V2 w systemie Windows 7.
Nauczyłem się z kilku źródeł, że najbardziej oczywiste polecenie Remove-Item $targetDir -Recurse -Force
nie działa poprawnie. Obejmuje to oświadczenie w pomocy online programu PowerShell V2 (znalezione przy użyciu Get-Help Remove-Item -Examples
), które stwierdza:
... Ponieważ parametr Recurse w tym poleceniu cmdlet jest wadliwy, polecenie używa polecenia cmdlet Get-Childitem, aby uzyskać pożądane pliki, i używa operatora potoku do przekazania ich do polecenia cmdlet Remove-Item ...
Widziałem różne przykłady, które używają Get-ChildItem i potokują go do Remove-Item , ale przykłady zwykle usuwają pewien zestaw plików oparty na filtrze, a nie cały katalog.
Szukam najczystszego sposobu wysadzenia całego katalogu, plików i katalogów podrzędnych, bez generowania komunikatów ostrzegawczych użytkownika przy użyciu najmniejszej ilości kodu. Jednoliniowy byłby miły, jeśli jest łatwy do zrozumienia.
źródło
RD /S /Q
rd
to alias dlaRemove-Item
w PowerShell.cmd /c "rd /s /q"
działa jednak.Odpowiedzi:
rzeczywiście działa zgodnie z reklamą tutaj.
są skrótami, które też działają.
O ile rozumiem,
-Recurse
parametr po prostu nie działa poprawnie, gdy próbujesz rekurencyjnie usunąć przefiltrowany zestaw plików. Wydaje się, że zabicie jednego katalogu i wszystkiego poniżej działa dobrze.źródło
cmd /c rd
jak podano poniżej.Użyłem:
Działa to dla mnie jak urok (ukradłem go z Ubuntu).
źródło
rm
to alias dlaRemove-Item
domyślnej konfiguracji PowerShell. Sprawdź wyniki,Get-Alias rm
aby uzyskać więcej informacji.-r
Się korzystając z częściowym zachowaniem dopasowania PowerShell w sprawie parametrów. PonieważRemove-Item
ma tylko jeden parametr rozpoczynający się od „r”-Recurse
,-r
pasuje do tego. Tak więc, po wszystko będzie działać tak samo:rm -r
,rm -re
,Remove-Item -Recurse
. (Uwaga: anirm -rf
ani nierm -r -f
będzie działać, alerm -r -fo
będzie. Nie-rf
pasuje do żadnych parametrów i-f
pasuje do więcej niż jednego.)rm -rf folder
i oczywiście nie udało się. Początkowo głosowałem za odpowiedzią (ponieważ napisano Ubuntu). Dzięki komentarzowi @chwarr, wypróbowałem go bez niegof
i wybrałem alias zamiast binarnego rm. Chciałbym, żeby Tuan zaktualizował swoje źródło (nie jestem pewien, czy Tuan wiedział, że to był pseudonim, czy naprawdę myślał, że to unix rm ;-)-R
zamiast-r
(choć o ile wiem, PowerShell jest podobny do reszty systemu Windows, bez rozróżniania wielkości liter, dlatego nie powinno to robić różnicy), ale mam błąd, że foldery, które próbuję usunąć, są nie pusty.Podczas usuwania plików rekurencyjnie za pomocą prostego
Remove-Item "folder" -Recurse
czasami widzę przejściowy błąd:[folder] cannot be removed because it is not empty.
Ta odpowiedź próbuje zapobiec temu błędowi poprzez indywidualne usunięcie plików.
Ważnym szczegółem jest sortowanie wszystkich elementów za pomocą,
pspath -Descending
aby liście były usuwane przed korzeniami. Sortowanie odbywa się na podstawiepspath
parametru, ponieważ ma to większą szansę na pracę dla dostawców innych niż system plików. The-Include
parametr jest tylko wygodą, jeśli chcesz filtrować elementy do usunięcia.Jest podzielony na dwie funkcje, ponieważ uważam, że przydatne jest sprawdzenie, co zamierzam usunąć, uruchamiając
źródło
remove-item -recurse
Powershell v5, więc to rozwiązanie jest dla mnie najlepsze.... pracował dla mnie
źródło
Wypróbuj ten przykład. Jeśli katalog nie istnieje, nie pojawia się błąd. Możesz potrzebować PowerShell v3.0.
źródło
Użyj old-schoolowej komendy DOS:
źródło
/q
(Tryb cichy, nie pytaj, czy możesz usunąć drzewo katalogów za pomocą / S).Z jakiegoś powodu odpowiedź Johna Reesa czasami nie działała w moim przypadku. Ale poprowadziło mnie to w następującym kierunku. Najpierw próbuję usunąć katalog rekurencyjnie za pomocą opcji buggy -recurse. Następnie schodzę do każdego pozostałego podkatalogu i usuwam wszystkie pliki.
źródło
Aby uniknąć błędów „Katalog nie jest pusty” w zaakceptowanej odpowiedzi, po prostu użyj starej, dobrej komendy DOS, jak sugerowano wcześniej. Pełna składnia PS gotowa do wklejania kopii to:
źródło
Przyjąłem inne podejście zainspirowane przez @ john-rees powyżej - szczególnie, gdy jego podejście zaczęło mi się nie udać w pewnym momencie. Zasadniczo powtórz poddrzewo i posortuj pliki według ich długości ścieżki - usuń od najdłuższego do najkrótszego
Jeśli chodzi o magię -LiteralPath, oto kolejna gotchya, która może cię uderzyć: https://superuser.com/q/212808
źródło
LUB
Jeśli masz ogromny katalog, zazwyczaj robię to
Uruchom to na innym terminalu PowerShell, a zatrzyma się po zakończeniu.
źródło
Usunięcie całego drzewa folderów czasami działa, a czasami kończy się niepowodzeniem z błędami „Katalog nie jest pusty”. Późniejsza próba sprawdzenia, czy folder nadal istnieje, może spowodować błędy „Odmowa dostępu” lub „Nieautoryzowany dostęp”. Nie wiem, dlaczego tak się dzieje, choć można uzyskać wgląd w ten post StackOverflow .
Udało mi się obejść te problemy, określając kolejność usuwania elementów w folderze i dodając opóźnienia. Dla mnie dobrze działa:
Artykuł Microsoft TechNet Korzystanie z właściwości obliczeniowych w programie PowerShell pomógł mi w uzyskaniu listy podfolderów posortowanych według głębokości.
Podobne problemy z niezawodnością z RD / S / Q można rozwiązać, uruchamiając DEL / F / S / Q przed RD / S / Q i uruchamiając RD po raz drugi, jeśli to konieczne - najlepiej z przerwą pomiędzy nimi (tj. Używając pingowania jak pokazano poniżej).
źródło
Naprawdę proste:
źródło
Kolejna przydatna sztuczka:
Jeśli znajdziesz wiele plików o tej samej lub podobnej konwencji nazw (np. Plik mac z nazwą prefiksu kropki ... to słynne wyciągnięcie pliku), możesz łatwo usunąć je za pomocą jednego wiersza z PowerShell w następujący sposób:
Ta linia usunie wszystkie pliki z kropką na początku nazwy w bieżącym katalogu, a także wszystkie pliki o takich samych okolicznościach w innych folderach w tym katalogu. Pamiętaj o tym podczas korzystania z niego. :RE
źródło
rm -rf .*
? Nie mam PowerShell do przetestowania, ale myślę, że to zadziała.Aby usunąć całą zawartość, w tym strukturę folderów, użyj
-recurse
Dodany doremove-item
, zapewnia interaktywne komunikaty są wyłączone.źródło
Napisałem powyższe, aby wyczyścić niektóre pliki dziennika bez usuwania katalogu nadrzędnego, a to działa idealnie!
źródło
źródło