在PowerShell中强制删除目录及其所有子目录的最简单方法是什么?我在Windows 7中使用PowerShell V2。
我从几个来源了解到,最明显的命令,Remove-Item $targetDir -Recurse -Force,不能正确工作。这包括PowerShell V2在线帮助中的语句(使用Get-Help Remove-Item -Examples找到),声明:
...因为这个cmdlet中的递归参数是错误的,该命令使用get - childitem cmdlet来获取所需的文件,并使用管道操作符将它们传递给Remove-Item cmdlet…
我见过使用Get-ChildItem并将其输送到remove - item的各种示例,但这些示例通常基于过滤器删除一些文件集,而不是整个目录。
我正在寻找最干净的方法来吹出整个目录,文件和子目录,而不生成任何用户警告消息使用最少的代码量。如果简单易懂,那么一行代码最好。
当使用简单的删除项“文件夹”递归删除文件时,我有时会看到一个间歇性错误:[文件夹]不能删除,因为它不是空的。
这个答案试图通过单独删除文件来防止该错误。
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
一个重要的细节是使用pspath - descent对所有项进行排序,以便在根项之前删除叶项。排序是在pspath参数上完成的,因为它更有可能用于提供程序而不是文件系统。如果您想筛选要删除的项,则-Include参数只是一种方便。
它分为两个函数,因为我发现它可以通过运行来查看我将要删除的内容
Get-Tree some_dir | select fullname
删除整个文件夹树有时有效,有时失败,会出现“目录非空”错误。随后尝试检查文件夹是否仍然存在可能会导致“访问被拒绝”或“未经授权的访问”错误。我不知道为什么会发生这种情况,尽管可以从这篇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之前运行DEL /F /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