如何使用 PowerShell 递归删除具有特定名称的文件夹?
Posted
技术标签:
【中文标题】如何使用 PowerShell 递归删除具有特定名称的文件夹?【英文标题】:How can I recursively delete folder with a specific name with PowerShell? 【发布时间】:2011-04-08 13:38:52 【问题描述】:我可以删除多个文件夹中具有特定扩展名的文件:
Get-childitem * -include *.scc -recurse | remove-item
但我还需要删除具有特定名称的文件夹 - 特别是当您从 subversion 存储库中下拉文件时 subversion 创建的文件夹(“.svn”或“_svn”)。
【问题讨论】:
对于那些想要删除所有.svn
文件夹的人:也许svn export
对你有用。它将进行结帐,但不添加 .svn
文件夹。
【参考方案1】:
这个one 应该这样做:
get-childitem -Include .svn -Recurse -force | Remove-Item -Force -Recurse
Other版本:
$fso = New-Object -com "Scripting.FileSystemObject"
$folder = $fso.GetFolder("C:\Test\")
foreach ($subfolder in $folder.SubFolders)
If ($subfolder.Name -like "*.svn")
remove-item $subfolder.Path -Verbose
【讨论】:
您可能会在前几次收到“无法删除项目目录不为空”的错误。但是,当您继续尝试上述命令时,它会起作用。【参考方案2】:我倾向于避免Get-ChildItem
上的-Include
参数,因为它比-Filter
慢。但是在这种情况下(因为它不能表示为-Filter
),这就是我要使用的:
Get-ChildItem . -Include .svn,_svn -Recurse -Force | Remove-Item -Recurse -Force
或者如果在提示符下输入:
ls . -inc .svn,_svn -r -fo | ri -r -fo
【讨论】:
不是错字,而是通配符?
没有按我的预期工作。它应该匹配_
和.
,但它不匹配.
。去图吧。
我很困惑@Keith。你说你避免 -include,但这就是你使用的。
我说我“倾向于”避免 -include 出于上述原因。但是,如果您需要根据几个不同的通配符规范进行过滤, -filter 将无法处理。所以使用 -include 应该不会比通过 Where-Object 管道过滤文件名慢。
@MikeShepard(和 Keith)我冒昧地将 Keith 的一些评论编辑到答案正文中,因为它也让我感到困惑!我想最好将两个 cmets(和这个)留给后代......
我在使用它时遇到了错误,大概是因为它试图在已删除的文件夹上调用Get-ChildItem
,所以我将-ErrorAction SilentlyContinue
添加到ri
或Remove-Item
命令以使其静音。 【参考方案3】:
递归删除具有特定名称的文件夹-Filter
明显快于-Include
。
因此,为了可见性,这里是@Keith 答案的更快版本:
完全打印出来:
Get-ChildItem -Filter .svn -Recurse -Force | Remove-Item -Recurse -Force
短版:
ls . -filter .svn -r -fo | ri -r -fo
【讨论】:
hm - 是否还有输出已删除路径的版本?只是让我知道它有效。以上是关于如何使用 PowerShell 递归删除具有特定名称的文件夹?的主要内容,如果未能解决你的问题,请参考以下文章
powershell 使用PowerShell以递归方式删除Windows中所有子文件夹中的`node_modules`文件夹,以避免超出路径max_length
powershell 此递归PowerShell脚本从SharePoint中删除网站及其所有子网站。这消除了无法进行del的问题