重命名项目重命名问题

Rename-Item renaming issue

我写了一些代码,第一次运行良好。但是,我现在已经用新的虚拟文件替换了这些文件,我现在得到以下内容:

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

知道如何避免这个问题吗?

谢谢

-replace 运算符

  • 接受一个正则表达式作为它的第一个操作数并且
  • 默认执行子串匹配。

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

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

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

涵盖.prd.zip的更通用的重新表述:

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

请参阅下面的说明。

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

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

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

中将其引用为 </code>(第一个捕获组,...) <pre><code>> @( 'example.zip', 'example.prd' ) -replace '\.(prd|zip)$','_.' example_zip.zip example_prd.prd

请注意替换字符串中的 </code> 是如何引用捕获的任何捕获组 <code>(prd|zip),第一个输入是 zip,第二个输入是 prd

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

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

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