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.

Author: Peter Mortensen, 2009-11-18

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.

 373
Author: Joey,
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).

 31
Author: Tuan Jinn,
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
 16
Author: John Rees,
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

 9
Author: stevethecollier,
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>
 9
Author: Peter Mortensen,
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
 8
Author: steve,
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
 6
Author: Dejan,
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
        }
    }
}
 5
Author: jdoose,
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

 2
Author: Peter McEvoy,
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
 1
Author: DusanV,
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

 1
Author: Daniel Alberto Lepe Ayala,
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
 1
Author: MikeOnline,
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.

 1
Author: steve simon,
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/

 0
Author: thiyagu selvaraj,
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.

 0
Author: Gajendra D Ambi,
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!

 -1
Author: Tom Stevenson,
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