在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
虽然rm -r的结果很好,但下面的方法更快:
$fso = New-Object -ComObject scripting.filesystemobject
$fso.DeleteFolder("D:\folder_to_remove")
为了测试这一点,你可以很容易地创建一个包含X个文件的文件夹(我使用:Disk Tools来快速生成文件)。
然后运行每个变量,使用:
Measure-Command {rm D:\FOLDER_TO_DELETE -r}
Measure-Command {Remove-Item -Path D:\FOLDER_TO_DELETE -Recurse -Force}
Measure-Command {rd -r FOLDER_TO_DELETE }
$fso.DeleteFolder("D:\folder_to_remove")
Measure-Command {$fso.DeleteFolder("D:\FOLDER_TO_DELETE")}
我的测试文件夹上的结果是:
Remove-Item - TotalMilliseconds : 1438.708
rm - TotalMilliseconds : 1268.8473
rd - TotalMilliseconds : 739.5385
FSO - TotalMilliseconds : 676.8091
结果各不相同,但在我的系统上,获胜者是fileSystemObject。我建议在目标文件系统上进行测试,看看哪种方法最适合您。