2017-05-27 174 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