PowerShell / Regex:重命名所有文件,修改数字序列

时间:2017-05-27 23:30:45

标签: regex powershell replace file-rename batch-rename

我目前有一个包含数千个文件的目录 每个文件在文件名中的某处都有_c04__c05_等。

我需要将所有这些文件重命名为_c004__c005_等 唯一需要改变的是增加额外的零 这封信总是c

我是正则表达式的新手,我不知道搜索和替换此字符串的正确方法。

到目前为止,我已经编写了这段代码,但显然这不是可扩展的...... (因为它只修改04而不是01-99)

dir | rename-item -NewName {$_.name -replace "_c04_","_c004_"}

2 个答案:

答案 0 :(得分:3)

ConnorLSW's answer向您展示如何在正则表达式中使用捕获组((...))以及如何在替换字符串($1)中捕获它以执行所需的名称转换

您自己的解决方案尝试优于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的那些数字替换它。