如何使用 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 添加到riRemove-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中的所有空文件夹?

powershell 使用PowerShell以递归方式删除Windows中所有子文件夹中的`node_modules`文件夹,以避免超出路径max_length

递归查找文件中的文本 (PowerShell)

powershell 此递归PowerShell脚本从SharePoint中删除网站及其所有子网站。这消除了无法进行del的问题

如何递归删除所有文件的尾随空格?