Как рекурсивно удалить весь каталог с PowerShell 2.0? - PullRequest
242 голосов
/ 18 ноября 2009

Какой самый простой способ принудительно удалить каталог и все его подкаталоги в PowerShell? Я использую PowerShell V2 в Windows 7.

Из нескольких источников я узнал, что наиболее очевидная команда Remove-Item $targetDir -Recurse -Force работает неправильно. Это включает в себя справку в онлайн-справке PowerShell V2 (с использованием Get-Help Remove-Item -Examples), в которой говорится:

... Поскольку параметр Recurse в этом командлете неисправен, команда использует командлет Get-Childitem для получения нужных файлов и использует оператор конвейера для передачи их в командлет Remove-Item ...

Я видел различные примеры, которые используют Get-ChildItem и передают его на Remove-Item , но примеры обычно удаляют некоторый набор файлов на основе фильтра, а не весь каталог.

Я ищу самый чистый способ уничтожить весь каталог, файлы и дочерние каталоги, не генерируя никаких предупреждений пользователя, используя наименьшее количество кода. Однострочник был бы хорош, если бы его было легко понять.

Ответы [ 16 ]

1 голос
/ 13 июля 2017

Чтобы удалить все содержимое, включая структуру папок, используйте

get-childitem $dest -recurse | foreach ($_) {remove-item $_.fullname -recurse}

-recurse, добавленное к remove-item, обеспечивает отключение интерактивных подсказок.

1 голос
/ 07 июля 2017

Удаление целого дерева папок иногда работает, а иногда не удается с ошибками «Каталог не пустой». Впоследствии попытка проверить, существует ли папка, может привести к ошибкам «Доступ запрещен» или «Несанкционированный доступ». Я не знаю, почему это происходит, хотя некоторая информация может быть получена из этой публикации StackOverflow .

Мне удалось обойти эти проблемы, указав порядок, в котором элементы в папке удаляются, и добавив задержки. Следующее работает хорошо для меня:

# 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

Статья Microsoft TechNet Использование вычисляемых свойств в PowerShell помогли мне получить список подпапок, отсортированных по глубине.

Подобные проблемы с надежностью RD / S / Q можно решить, выполнив RD / S / Q дважды - в идеале с паузой между ними (т. Е. Используя ping , как показано ниже).

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 голос
/ 08 мая 2016

Еще один полезный трюк:

Если вы найдете много файлов с одинаковыми или похожими именами (например, Mac-файл с именем префикса точки ... с этим известным извлечением файла), вы можете легко удалить их одной строкой из powershell, например так:

ls -r .* | rm

В этой строке будут удалены все файлы с точкой в ​​начале имени в текущем каталоге, а также все файлы с такими же обстоятельствами в других папках внутри этого каталога. Помните об этом при использовании. : D

1 голос
/ 07 мая 2014

Действительно просто:

remove-item -path <type in file or directory name>, press Enter
0 голосов
/ 24 февраля 2019
rm -r <folder_name>
c:\>rm -r "my photos"
0 голосов
/ 21 августа 2017
$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"
}

Написал выше, чтобы очистить некоторые файлы журналов, не удаляя родительский каталог, и это прекрасно работает!

...