我知道Windows计算机上许多不需要的文件的文件名的共同特征。如何使用单个regular expression PowerShell命令从给定的文件夹或文件夹层次结构中删除所有这些文件?
答案 0 :(得分:35)
您可以通过接受RegEx模式的Where-Object过滤器管道Get-ChildItem命令,然后将其传递到Remove-Item。我认为这将比使用Select-String更快,更好的结果。使用如下命令:
Get-ChildItem $Path | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item
Name属性仅匹配文件或文件夹的名称以及文件的扩展名。它不会与路径上的其他东西相匹配。这会将FileInfo对象传递给管道,Remove-Item将作为管道输入传递,并将删除相关文件。
如果要包含路径的子文件夹,可以将-Recurse开关添加到Get-ChildItem命令,它看起来像这样:
Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item
如果您只想删除文件,可以在Where语句中指定,方法是查看FileInfo对象的PSIsContainer属性,并通过在对象前添加一个感叹号来反转它:
Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>" -and !$_.PSIsContainer} | Remove-Item
答案 1 :(得分:4)
您可以使用命令
ls -name | select-string -pattern ".*\(\d+\).*" | %{rm $_}
引号的内容是您的正则表达式。此示例中的正则表达式搜索文件名中包含(#)的文件,其中#是任何非负整数。这对于删除多次转储同一组文件的文件夹中的重复项非常有用,例如音乐管理器。
如果在-name
之后添加-rls -name -r | select-string -pattern ".*\(\d+\).*" | %{rm $_}
它将通过子文件夹递归并删除所有子文件夹中的匹配文件。
命令的结构如下:
答案 2 :(得分:2)
我用这个:
(Get-ChildItem -Path $Path | Select -ExpandProperty Fullname) -match <regex> | Remove-Item
(Get-ChildItem -Path $Path -Recurse | Select -ExpandProperty Fullname) -match <regex> | Remove-Item
或者如果你有V3或更高版本,那么你有自动成员枚举:
(Get-ChildItem -Path $Path).Fullname -match <regex> | Remove-Item
(Get-ChildItem -Path $Path -Recurse).Fullname -match <regex> | Remove-Item
如果您当前的工作目录是您要删除文件的目录,并且所有文件都在该目录中,则名称才能生效(递归可能会找到多个具有相同名称的文件,但是不同的路径)。