如何使用PowerShell递归删除特定名称的文件夹?

45

我可以使用以下方法在多个文件夹中删除具有特定扩展名的文件:

Get-childitem * -include *.scc -recurse | remove-item

但我还需要删除特定名称的文件夹-特别是当您从subversion repo中拉取文件时创建的那些(".svn"或"_svn")。


1
对于那些想要删除所有.svn文件夹的人来说:也许svn export对你有用。它会执行一个检出操作,但不会添加.svn文件夹。 - Frank Kusters
3个回答

78

这个方法可以解决问题:

get-childitem -Include .svn -Recurse -force | Remove-Item -Force -Recurse

其他版本:

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

1
你可能会在前几次尝试中遇到“无法删除项目:目录非空”之类的错误。但是,当你不断尝试上述命令时,它就能够正常工作了。 - kovac

16

我倾向于避免在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

1
不是打错字,但通配符字符 ? 没有按照我的预期工作。它应该匹配 _.,但它没有匹配 .。真是让人费解。 - Keith Hill
我有点困惑 @Keith。您说过您避免使用-include,但是您用了这个东西。 - Mike Shepard
1
我说我“倾向于”避免使用-include,原因如上所述。然而,如果您需要基于几个不同的通配符规范进行过滤,-filter将无法处理。因此,使用-include应该不会比通过Where-Object管道筛选文件名慢。 - Keith Hill
3
@MikeShepard(和Keith)我冒昧将Keith的一些评论编辑到答案正文中,因为它让我感到困惑!我想最好把这两个评论(还有这个)留给后代...... - Ruben Bartelink
1
我在使用这个命令时遇到了错误,可能是因为它试图在已经删除的文件夹上调用 Get-ChildItem,所以我在 riRemove-Item 命令中添加了 -ErrorAction SilentlyContinue 来将其静音。 - angularsen
这对我很有效。它还解决了如何在单个调用中指定多个目录的问题。最后,它帮助我理解了“-Filter”和“-Include”的区别,现在我知道该何时使用其中之一。 - Mike

13

使用-Filter进行快速删除

递归删除具有特定名称的文件夹时,-Filter-Include 要快得多。

因此,为了方便查看,这是@Keith答案的更快版本:

完整输入:

Get-ChildItem -Filter .svn -Recurse -Force | Remove-Item -Recurse -Force

简明版:

ls . -filter .svn -r -fo | ri -r -fo

2
有没有一个输出已删除路径的版本?这样我就知道它是否有效了。 - sommmen
1
刚才用它来删除存档中的git文件夹,完美运行。谢谢。因此,要递归地删除.git文件夹,请运行 ls . -filter .git -r -fo | ri -r -fo - Anatoly Mironov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接