重命名项目重命名问题
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")}
我写了一些代码,第一次运行良好。但是,我现在已经用新的虚拟文件替换了这些文件,我现在得到以下内容:
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")}