2017-05-27 171 views
1

我目前有一个包含数千个文件的目录。
每个文件有_c04__c05_等文件名内的某处。PowerShell /正则表达式:重命名所有文件,修改数字序列

我需要所有这些文件重命名为_c004__c005_
需要修改的东西,是添加额外的零。
该信件将始终为c

我很新的正则表达式,我不知道正确的方法来搜索和替换这个字符串。

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

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

回答

2

ConnorLSW's answer前面加上数字来替换它展示了如何使用正则表达式中的捕获组((...))以及对其在替换字符串($1)中捕获的内容的引用以执行所需的名称转换。

自己的解决方案的尝试是最好的ConnorLSW的答案%ForEach-Object)为基础的方法,因为它仅涉及Rename-Item一个调用一个使用脚本块参数来计算新名称。

下面是一个使用zero-width lookbehind/ahead assertions只匹配位置0应插入的一个工作变化,而无需重复输入字符串的任何部分:

Get-ChildItem | Rename-Item -NewName { $_.Name -replace '(?<=_c)(?=\d{2}_)', '0' } -WhatIf 
  • 常见参数-WhatIf预览更改;删除它来执行实际的重命名。

  • 正如ConnorLSW的回答,引号('...')既用于正则表达式和替换字符串,因为"..."可以使用PowerShell的上前面琴弦扩展(插值)产生混淆;例如,"$1"将被解释为一个可变参考;如果你使用"...",一定要逃出$实例是旨在为正则表达式引擎`$

  • 注意,其名称是导致没有任何转换输入文件将触发非终止错误,因为本身出现故障时尝试重命名文件。
    如果这是一个问题,你可以使用一个通配符模式预选感兴趣的文件,LotPings指出:
    Get-ChildItem *_c[0-9][0-9]_* | Rename-Item ...

+0

@LotPings好一点,我已经把它添加到答案,但我已经把它分开,因为我不想从溶液中分散(在OP自己的命令对未经过滤的'GET-ChildItem'输入工作太)。 – mklement0

1
Get-ChildItem | % { 
    $NewName = $_.Name -replace '_c(\d{2})_','_c0$1_' 
    Rename-Item -Path $_.FullName -NewName $NewName 
} 

你可能寻找这样的事情,找到任何匹配_c.._其中. s为任意数字(0-9),然后用那些具有0