从多子文件夹中的文件中递归删除“ _v1”

时间:2019-08-06 06:13:39

标签: powershell

我在文件夹和子文件夹中存储了多个文件。它们几乎都在BaseName的末尾包含_v1。我尝试了以下操作,但出现错误。

Get-ChildItem -Recurse * -Filter "/(_v1)/" |
    Rename-Item -NewName { $_.Name -replace '/(_v1)/','' } -WhatIf

错误:

  

Get-ChildItem:第二个路径片段不能是驱动器或UNC名称。

2 个答案:

答案 0 :(得分:2)

尝试一下:

Get-ChildItem "C:\test\ " -recurse  -Filter "*_V1*" | % { Rename-Item $_ -NewName $($_.Name -replace "_V1","" ) } 

答案 1 :(得分:1)

PowerShell不是Perl。正斜杠并不表示正则表达式,它们只是文字正斜杠,因此您的过滤器表达式和搜索字符串都不会与预期文件匹配。另外,括号(即捕获组)没有任何作用,因此应将其删除。

使用通配符模式作为Get-ChildItem的过滤器字符串,并将正则表达式替换应用于基名,以避免在文件名中的其他地方意外替换_v1

Get-ChildItem -Filter '*_v1.*' -Recurse |
    Rename-Item -NewName { ($_.BaseName -replace '_v1$') + $_.Extension }

如果您至少运行PowerShell v3,则可以将参数-File添加到Get-ChildItem,以使其不会返回目录。