我写了一些代码,第一次工作正常。但是,我现在用新的虚拟文件替换了文件,现在我得到以下内容:
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 :(得分:2)
-replace
运算符
因此,您必须修改作为替换的第一个操作数的正则表达式按预期工作:
$_.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")}