Powershell 通过复制最后三个字符来重命名文件



有没有更简单的方法可以在Powershell中复制文件名中的最后三个字符? 我一直在使用以下代码

要复制整个名称:

dir | Rename-Item -NewName {$_.basename +$_.basename + $_.extension}

要删除不需要的字符:

Get-ChildItem  -Recurse | 
foreach { $_ | rename-item -newname ($_.Name -replace '(.{15})..(.+)','$1$2')  }

但是希望使用一种更省时的方法吗?

编辑: 我想重复最后三个字符;例如:

以前:

00469-101236-01-V-3-20-001

后:

00469-101236-01-V-3-20-001 001

-replace运算符提供了几个占位符来引用正则表达式在替换操作数中匹配的内容;$&指的是整个匹配[1],可以在这里使用:

PS> '00469-101236-01-V-3-20-001' -replace '...$', '$& $&'
00469-101236-01-V-3-20-001 001

除了'...$',你也可以做'.{3}$'
注意$&扩展到'001',即最后3个字符。文件名的开头(最后 3 个字符'00469-101236-01-V-3-20-'之前的所有内容)也存在的原因是-replace仅替换输入字符串的匹配部分

在命令上下文中:

Get-ChildItem -Recurse | Rename-Item -NewName { 
($_.BaseName -replace '...$', '$& $&') + $_.Extension 
} -Whatif

注意:上述命令中的-WhatIf通用参数可预览操作。一旦您确定操作将执行您想要的操作,请删除-WhatIf


[1] 您也可以使用$0代替$&,即使只有$&被直接记录;$0$<n>为模型,其中<n>是指正则表达式((...))内捕获组的索引,以1($1)开头.
$0的工作方式类似于$&可以从底层Regex类型的文档中推断出来:"如果正则表达式引擎可以找到匹配项,Groups属性返回的 GroupCollection 对象的第一个元素(索引0处的元素)包含一个与整个正则表达式模式匹配的字符串" - 谢谢,marsze.
这个有用的正则表达式文档站点对比了各种正则表达式引擎的行为。

最新更新