我目前有一个包含数千个文件的目录
每个文件在文件名中的某处都有_c04_
或_c05_
等。
我需要将所有这些文件重命名为_c004_
或_c005_
等
唯一需要改变的是增加额外的零
这封信总是c
。
我是正则表达式的新手,我不知道搜索和替换此字符串的正确方法。
到目前为止,我已经编写了这段代码,但显然这不是可扩展的...... (因为它只修改04而不是01-99)
dir | rename-item -NewName {$_.name -replace "_c04_","_c004_"}
答案 0 :(得分:3)
ConnorLSW's answer向您展示如何在正则表达式中使用捕获组((...)
)以及如何在替换字符串($1
)中捕获它以执行所需的名称转换
PowerShell使用.NET Framework的regular-expression language,简要介绍了您在运行Get-Help about_Regular_Expressions
时可用的内容。
正则表达式不仅用于-replace
,还用于-match
运算符和Select-String
等cmdlet。
我的this answer涵盖了适用于-replace
运算符的语法。
您自己的解决方案尝试优于ConnorLSW答案中基于%
(ForEach-Object
)的方法,因为它只涉及Rename-Item
的单调用它使用 script-block参数来计算新名称。
以下是使用zero-width lookbehind/ahead assertions仅匹配应插入0
的位置的工作变体,而无需重复输入字符串的任何部分:< / p>
Get-ChildItem | Rename-Item -NewName { $_.Name -replace '(?<=_c)(?=\d{2}_)', '0' } -WhatIf
公共参数-WhatIf
预览更改;删除它以执行实际重命名。
在ConnorLSW的回答中,单引号('...'
)用于正则表达式和替换字符串,因为"..."
可能会与PowerShell的混淆产生混淆前面的字符串扩展(插值);例如,"$1"
将被解释为变量引用;如果您使用"..."
,请确保将{em>正则表达式引擎的$
实例转义为`$
。
请注意,任何名称不会导致转换的输入文件都会触发非终止错误,因为尝试将文件重命名为自身会失败。
如果这是一个问题,您可以使用通配符模式预先选择感兴趣的文件,如LotPings所示:
Get-ChildItem *_c[0-9][0-9]_* | Rename-Item ...
答案 1 :(得分:1)
Get-ChildItem | % {
$NewName = $_.Name -replace '_c(\d{2})_','_c0$1_'
Rename-Item -Path $_.FullName -NewName $NewName
}
你可能正在寻找类似这样的东西,找到匹配_c.._
的任何内容,其中.
s是任意数字0-9,然后用前面带有0的那些数字替换它。