如何使用PowerShell 2.0recursion删除整个目录?

在PowerShell中强制删除目录及其所有子目录的最简单方法是什么? 我在Windows 7中使用PowerShell V2。

我从几个来源了解到,最明显的命令Remove-Item $targetDir -Recurse -Force不能正常工作。 这包括PowerShell V2联机帮助(使用Get-Help Remove-Item -Examples )中的一条语句,其中声明:

…因为此cmdlet中的Recurse参数有错误,所以该命令使用Get-Childitem cmdlet获取所需的文件,并使用pipe道运算符将它们传递给Remove-Item cmdlet …

我已经看到了各种使用Get-ChildItem并将其传递给Remove-Item的示例,但这些示例通常会删除基于筛选器的一些文件集,而不是整个目录。

我正在寻找最干净的方式来吹出一个完整的目录,文件和子目录,而不会使用最less量的代码生成任何用户警告消息。 如果易于理解的话,一行就好了。

 Remove-Item -Recurse -Force some_dir 

确实如此处所宣传的那样工作。

 rm -r -fo some_dir 

是速记别名,也工作。

据我了解,当您尝试recursion删除一组过滤文件时, -Recurse参数不能正常工作。 为了杀死一个目录和下面的所有内容,似乎工作正常。

我用了:

 rm -r folderToDelete 

这对我来说就像一个魅力(我从Ubuntu偷了它)。

 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 -Descendingsorting所有项目,以便在根之前删除叶子。 sorting是在pspath参数上完成的,因为这对于文件系统以外的提供者有更多的工作机会。 如果要过滤要删除的项目,则“ -Include参数只是一个方便之处。

它分为两个函数,因为我发现通过运行来查看要删除的内容非常有用

 Get-Tree some_dir | select fullname 

使用旧的DOS命令:

 rd /s <dir> 
 rm -r ./folder -Force 

…为我工作

试试这个例子。 如果该目录不存在,则不会引发错误。 您可能需要PowerShell v3.0。

 remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue 

出于某种原因,约翰·里斯的回答有时候不适用于我的案子。 但是这导致了我的下一个方向。 首先,我尝试用buggy -recurse选项recursion删除目录。 之后,我下降到每个剩下的子目录并删除所有文件。

 function Remove-Tree($Path) { Remove-Item $Path -force -Recurse -ErrorAction silentlycontinue if (Test-Path "$Path\" -ErrorAction silentlycontinue) { $folders = Get-ChildItem -Path $Path –Directory -Force ForEach ($folder in $folders) { Remove-Tree $folder.FullName } $files = Get-ChildItem -Path $Path -File -Force ForEach ($file in $files) { Remove-Item $file.FullName -force } if (Test-Path "$Path\" -ErrorAction silentlycontinue) { Remove-Item $Path -force } } } 

为了避免接受答案的“目录不为空”错误,只需使用以前build议的良好的旧DOS命令即可。 完整的PS语法准备好复制粘贴:

 & cmd.exe /c rd /S /Q $folderToDelete 

另一个有用的技巧

如果你发现很多文件有相同或相似的名称约定(如带有点前缀名称的mac文件…那个着名的文件提示),你可以很容易地从powershell中删除它们,像这样:

 ls -r .* | rm 

这一行将删除当前目录中名称开头处的所有文件,以及该目录内其他文件夹内具有相同情况的所有文件。 使用时请注意。 :d

我采取了另外一种由@ john-rees启发的方法 – 特别是当他的方法在某个时候开始失败。 基本上recursion子树并按path长度sorting文件 – 从最长到最短删除

 Get-ChildItem $tfsLocalPath -Recurse | #Find all children Select-Object FullName,@{Name='PathLength';Expression={($_.FullName.Length)}} | #Calculate the length of their path Sort-Object PathLength -Descending | #sort by path length descending %{ Get-Item -LiteralPath $_.FullName } | Remove-Item -Force 

关于-LiteralPath魔术,这里有另一个可能会击中你的怪物: https ://superuser.com/q/212808

真的很简单:

 remove-item -path <type in file or directory name>, press Enter 

删除整个文件夹树有时会起作用,有时会因“目录不空”错误而失败。 随后尝试检查文件夹是否仍然存在可能导致“访问被拒绝”或“未经授权访问”错误。 我不知道为什么会发生这种情况,尽pipe可以从这个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中使用计算属性有助于我获取按深度sorting的子文件夹列表。

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 

删除包含文件夹结构用途的全部内容

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

-recurse添加到remove-item确保交互式提示被禁用。

 $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" } 

写上述清理一些日志文件,而不删除父目录,这完美的作品!