如何使用PowerShell删除与正则表达式匹配的文件夹中的文件?

Tec*_*et9 23 regex windows powershell file-io file

我知道我的Windows计算机上许多不需要的文件的文件名的共同特征.如何使用单个正则表达式 PowerShell命令从给定文件夹或文件夹层次结构中删除所有这些文件?

The*_*ian 37

您可以通过接受RegEx模式的Where-Object过滤器管道Get-ChildItem命令,然后将其传递到Remove-Item.我认为这将比使用Select-String更快,更好的结果.使用如下命令:

Get-ChildItem $Path | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item
Run Code Online (Sandbox Code Playgroud)

Name属性仅匹配文件或文件夹的名称以及文件的扩展名.它不会与路径上的其他东西相匹配.这会将FileInfo对象传递给管道,Remove-Item将作为管道输入传递,并将删除有问题的文件.

如果要包含路径的子文件夹,可以将-Recurse开关添加到Get-ChildItem命令,它看起来像这样:

Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item
Run Code Online (Sandbox Code Playgroud)

如果您只想删除文件,可以在Where语句中通过查看FileInfo对象的PSIsContainer属性来指定它,并通过在对象前面加上一个感叹号来反转它:

Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>" -and !$_.PSIsContainer} | Remove-Item
Run Code Online (Sandbox Code Playgroud)


Tec*_*et9 5

您可以使用命令,

ls -name | select-string -pattern ".*\(\d+\).*" | %{rm $_}
Run Code Online (Sandbox Code Playgroud)

其中引号的内容是您的正则表达式。此示例中的正则表达式搜索文件名中包含 (#) 的文件,其中 # 是任何非负整数。这对于删除同一组文件已被多次转储的文件夹中的重复项非常有用,例如音乐管理器。

如果在 -name 后添加 -r

ls -name -r | select-string -pattern ".*\(\d+\).*" | %{rm $_}
Run Code Online (Sandbox Code Playgroud)

它将遍历子文件夹并删除所有子文件夹中的匹配文件。

命令的结构如下:

  • ls 是 powershell 命令 get-childitem 的别名。它列出了当前文件夹中的所有元素。-name 参数指定只生成名称;我不想要其他信息,如文件大小。
  • select-string 基本上等同于 UNIX grep,它将模式(正则表达式)匹配到一堆以行分隔的字符串。-pattern 参数将 cmdlet 设置为采用正则表达式。
  • %{rm $ } 是一个 foreach 循环。它是说,“对于通过管道输入我的每一行(在这种情况下来自 select-string)”,执行以下操作,其中 $是给定的行。在这种情况下,我们正在对项目进行 rm-ing,其中 rm 是 Remove-Item 的别名。