重命名项重命名问题

时间:2016-11-04 15:57:40

标签: powershell file-rename get-childitem

我写了一些代码,第一次工作正常。但是,我现在用新的虚拟文件替换了文件,现在我得到以下内容:

MyTestFile.zip已更改为MyTestFile_zip.zip_zip.zip MyTestFile.prd已更改为MyTestFile_prd.prd_prd.prd

以下是代码:

Get-ChildItem -Filter "*.prd" -Recurse | Rename-Item -NewName {$_.name -replace '.prd','_prd.prd'}
Get-ChildItem -Filter "*.zip" -Recurse | Rename-Item -NewName {$_.name -replace '.zip','_zip.zip'} 

有什么想法可以避免这个问题吗?

由于

2 个答案:

答案 0 :(得分:2)

-replace运算符

  • 正则表达式作为其第一个操作数和
  • 默认情况下执行 substring 匹配。

因此,您必须修改作为替换的第一个操作数的正则表达式按预期工作:

$_.Name -replace '\.prd$','_prd.prd' 
  • .被转义为\.,以确保-replace将其视为文字;如果没有\,则.会匹配任何字符。

  • $确保表达式锚定到输入的 end ,即只在最后匹配。

更通用的重新制定,涵盖 {/ 1>} .prd.zip

$_.Name -replace '\.(prd|zip)$','_$1.$1' 

见下文的解释。

如果我们把所有这些放在一起,我们就可以使用一个管道:

Get-ChildItem -File *.prd, *.zip -Recurse | 
  Rename-Item -NewName { $_.Name -replace '\.(prd|zip)$','_$1.$1' }

使用正则表达式允许您一次处理多个扩展,并且还允许您通过捕获组(带括号的子表达式)引用正则表达式匹配(捕获)的部分内容您可以在替换字符串中引用$1(第一个捕获组,...)

> @( 'example.zip', 'example.prd' ) -replace '\.(prd|zip)$','_$1.$1'
example_zip.zip
example_prd.prd

请注意,替换字符串中的$1是指捕获的捕获组(prd|zip),第一个输入为zip,第二个输入为prd

答案 1 :(得分:0)

编者注: 虽然这个答案不适用于手头的具体问题,因为它插入了一个无关的.,但它确实显示了使用[System.IO.Path]::ChangeExtension()作为一般改变文件扩展名的强大方法。

或者使用.net方法更改文件扩展名:

Get-ChildItem -Filter "*.prd" -Recurse | Rename-Item -NewName {[System.IO.Path]::ChangeExtension($_.name,"_prd.prd")}