フォルダツリー全体の削除が機能することもあれば、「ディレクトリが空ではない」というエラーで失敗することもあります。その後、フォルダがまだ存在するかどうかを確認しようとすると、「アクセスが拒否されました」または「不正なアクセス」エラーが発生する可能性があります。これが発生する理由はわかりませんが、この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を実行することによって解決することができるDEL / F / S / Qの前にRD / S / Q及び実行RDを、すなわち使用(理想的には、休止との間に-二回必要に応じてPINGを示すように未満)。
DEL /F /S /Q "C:\Some\Folder\to\Delete\*.*" > nul
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
RD /S /Q