Jak rekurencyjnie usunąć cały katalog za pomocą PowerShell 2.0?
Jak najprościej usunąć katalog i wszystkie jego podkatalogi w PowerShell? Używam PowerShell V2 w Windows 7.
Dowiedziałem się z kilku źródeł, że najbardziej oczywiste polecenie, Remove-Item $targetDir -Recurse -Force
, nie działa poprawnie. Zawiera to oświadczenie w Pomocy Online PowerShell V2 (znalezione przy użyciu Get-Help Remove-Item -Examples
), które stwierdza:
...Ponieważ parametr Recurse w tym cmdlecie jest nieprawidłowy, polecenie używa get-Childitem cmdlet, aby uzyskać żądane pliki, i używa operatora rurociągu, aby przekazać je do pliku cmdlet Remove-Item...
Widziałem różne przykłady, które używają Get-ChildItem i przekierowują go do Remove-Item , ale przykłady zazwyczaj usuwają jakiś zestaw plików oparty na filtrze, a nie cały katalog.
Szukam najczystszego sposobu, aby zdmuchnąć cały katalog, pliki i katalogi potomne, bez generowania żadnych komunikatów ostrzegawczych użytkownika przy użyciu najmniejszej ilości kodu. Jednowierszowy byłby miło, jeśli jest to łatwe do zrozumienia.
16 answers
Remove-Item -Recurse -Force some_dir
Rzeczywiście działa zgodnie z reklamą tutaj.
rm -r -fo some_dir
Są skróty aliasów, które również działają.
O ile to Rozumiem, parametr -Recurse
nie działa poprawnie, gdy próbujesz usunąć przefiltrowany zestaw plików rekurencyjnie. Za zabicie pojedynczego dir i wszystkiego poniżej wydaje się działać dobrze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-17 17:52:54
Użyłem:
rm -r folderToDelete
To działa dla mnie jak urok (ukradłem to z Ubuntu).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-09 00:41:11
Podczas usuwania plików rekurencyjnie za pomocą prostego Remove-Item "folder" -Recurse
czasami widzę przerywany 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.
function Get-Tree($Path,$Include='*') {
@(Get-Item $Path -Include $Include -Force) +
(Get-ChildItem $Path -Recurse -Include $Include -Force) |
sort pspath -Descending -unique
}
function Remove-Tree($Path,$Include='*') {
Get-Tree $Path $Include | Remove-Item -force -recurse
}
Remove-Tree some_dir
Ważnym szczegółem jest sortowanie wszystkich elementów z pspath -Descending
tak, że liście są usuwane przed korzeniami. Sortowanie odbywa się na parametrze pspath
, ponieważ ma to większe szanse na działanie dla dostawców innych niż system plików. Parametr -Include
jest tylko wygodą, jeśli chcesz filtrować elementy do usunięcia.
Jest podzielony na dwie funkcje, ponieważ uważam, że przydatne jest sprawdzenie, co mam zamiar usunąć, uruchamiając
Get-Tree some_dir | select fullname
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 21:22:28
rm -r ./folder -Force
...worked for me
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-13 02:28:15
Użyj starej komendy DOS:
rd /s <dir>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-20 17:19:56
Spróbuj tego przykładu. Jeśli katalog nie istnieje, nie pojawia się żaden błąd. Możesz potrzebować PowerShell v3. 0.
remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-21 21:24:49
Aby uniknąć błędów" the directory is not empty " w zaakceptowanej odpowiedzi, po prostu użyj starego, dobrego polecenia DOS, jak sugerowano wcześniej. Pełna składnia PS gotowa do kopiowania i wklejania to:
& cmd.exe /c rd /S /Q $folderToDelete
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-26 12:54:08
Z jakiegoś powodu odpowiedź Johna Reesa czasami nie działała w moim przypadku. Ale to doprowadziło mnie w następującym kierunku. Najpierw próbuję usunąć katalog rekurencyjnie z opcją buggy-recurse. Następnie schodzę do każdego subdir, który został i usuwam wszystkie pliki.
function Remove-Tree($Path)
{
Remove-Item $Path -force -Recurse -ErrorAction silentlycontinue
if (Test-Path "$Path\" -ErrorAction silentlycontinue)
{
$folders = Get-ChildItem -Path $Path –Directory -Force
ForEach ($folder in $folders)
{
Remove-Tree $folder.FullName
}
$files = Get-ChildItem -Path $Path -File -Force
ForEach ($file in $files)
{
Remove-Item $file.FullName -force
}
if (Test-Path "$Path\" -ErrorAction silentlycontinue)
{
Remove-Item $Path -force
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 09:34:44
Przyjęłam inne podejście zainspirowane przez @john-rees powyżej-zwłaszcza, gdy jego podejście zaczęło mi w pewnym momencie zawodzić. Zasadniczo rekurencja podtree i sortowanie plików według ich długości ścieżki-delete od najdłuższego do najkrótszego
Get-ChildItem $tfsLocalPath -Recurse | #Find all children
Select-Object FullName,@{Name='PathLength';Expression={($_.FullName.Length)}} | #Calculate the length of their path
Sort-Object PathLength -Descending | #sort by path length descending
%{ Get-Item -LiteralPath $_.FullName } |
Remove-Item -Force
Jeśli chodzi o magię-LiteralPath, oto kolejny gotchya, który może cię uderzyć: https://superuser.com/q/212808
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-20 10:04:24
Naprawdę proste:
remove-item -path <type in file or directory name>, press Enter
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-09 00:41:58
Kolejna przydatna sztuczka:
Jeśli znajdziesz wiele plików o tej samej lub podobnej konwencji nazwy(np... ten słynny pulltion pliku), można łatwo usunąć je za pomocą jednej linii z powershell tak:
ls -r .* | rm
Ta linia usunie wszystkie pliki z kropką na początku nazwy w bieżącym katalogu, a także wszystkie pliki z tymi samymi okolicznościami w innych folderach wewnątrz tego katalogu. Należy o tym pamiętać, gdy używam go. : D
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-07 23:59:17
Usuwanie całego drzewa katalogów czasami działa, a czasami nie z błędami "katalog nie pusty". Następnie 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ć pewne spostrzeżenia można uzyskać z tego postu StackOverflow.
Udało mi się obejść te problemy, określając kolejność usuwania elementów w folderze i dodając opóźnienia. Na dla mnie działa dobrze:
# First remove any files in the folder tree
Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Where-Object { -not ($_.psiscontainer) } | Remove-Item –Force
# Then remove any sub-folders (deepest ones first). The -Recurse switch may be needed despite the deepest items being deleted first.
ForEach ($Subfolder in Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Select-Object FullName, @{Name="Depth";Expression={($_.FullName -split "\\").Count}} | Sort-Object -Property @{Expression="Depth";Descending=$true}) { Remove-Item -LiteralPath $Subfolder.FullName -Recurse -Force }
# Then remove the folder itself. The -Recurse switch is sometimes needed despite the previous statements.
Remove-Item -LiteralPath $FolderToDelete -Recurse -Force
# Finally, give Windows some time to finish deleting the folder (try not to hurl)
Start-Sleep -Seconds 4
Artykuł Microsoft TechNet wykorzystujący właściwości obliczone w PowerShell był dla mnie pomocny 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 Rd /S /Q dwa razy - najlepiej z pauzą pomiędzy (np. używając ping Jak pokazano poniżej).
RD /S /Q "C:\Some\Folder\to\Delete" > nul
if exist "C:\Some\Folder\to\Delete" ping -4 -n 4 127.0.0.1 > nul
if exist "C:\Some\Folder\to\Delete" RD /S /Q "C:\Some\Folder\to\Delete" > nul
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-07 19:10:23
Aby usunąć całą zawartość wraz ze strukturą folderów użyj
get-childitem $dest -recurse | foreach ($_) {remove-item $_.fullname -recurse}
-recurse
dodany do remove-item
zapewnia wyłączenie interaktywnych monitów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 07:35:07
Używanie PowerShell commnads do usuwania wszystkich plików i folderów
Remove-Item-Path "C:\dotnet-helpers*.* "- recurse
Recurse wierci w dół i znajduje dużo więcej plików. Parametr recurse - pozwoli Powershellowi usunąć wszystkie elementy potomne bez pytania o pozwolenie.Dodatkowo, parametr-force może być dodany do usuwania ukrytych lub tylko do odczytu plików.
Używając - Force command możemy w pełni usunąć Pliki
Korzystanie Z PowerShell commnads aby usunąć wszystkie pliki Wymuś w pełni
Remove-Item-Path "C:\dotnet-helpers*.* "- Force
Z przykładem: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-11 15:12:30
del <dir> -Recurse -Force # I prefer this, short & sweet
Lub
remove-item <dir> -Recurse -Force
Jeśli masz ogromny katalog, to zwykle robię to
while (dir | where name -match <dir>) {write-host deleting; sleep -s 3}
Uruchom to na innym terminalu powershell i zatrzyma się po zakończeniu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 10:30:07
$users = get-childitem \\ServerName\c$\users\ | select -ExpandProperty name
foreach ($user in $users)
{
remove-item -path "\\Servername\c$\Users\$user\AppData\Local\Microsoft\Office365\PowerShell\*" -Force -Recurse
Write-Warning "$user Cleaned"
}
Napisał powyższe, aby wyczyścić niektóre pliki dziennika bez usuwania katalogu nadrzędnego i to działa doskonale!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-21 11:16:09