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