2016-11-04 117 views
1

我写了一些代码,第一次工作正常。不过,我现在已经换成新的虚拟文件的文件,现在我得到如下:重命名 - 项目更名问题

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

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

由于

+0

奇怪了,你的解决方案的工作 – Esperento57

回答

2

-replace操作者

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

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

$_.Name -replace '\.prd$','_prd.prd' 
  • .转义为\.确保-replace把它当作一个文字;没有\,.将匹配任何字符。

  • $确保表达式是锚固端输入的,即仅在端部相匹配。

覆盖一个更通用再形成既.prd.zip

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

一个解释见下文。

如果我们把这一切都在一起,我们可以用一个管道脱身:

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

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

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

注意如何$1在替换字符串是指任何捕获捕获组(prd|zip),这是zip为第一输入端,和prd用于第二。

0

编者按: 虽然这个答案并没有为手头的具体问题的工作,因为它插入外来.,它确实表明使用[System.IO.Path]::ChangeExtension()作为一个可靠的方法一般要改变文件的扩展名。

或者使用.NET方法来改变文件扩展名:我的电脑上

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