2017-05-27 9 views
1

私は現在、数千のファイルを持つディレクトリを持っています。
各ファイルのファイル名には、_c04_または_c05_などがあります。PowerShell/Regex:すべてのファイルの名前を変更し、番号シーケンスを変更します。

は、私が余分なゼロを追加して、など_c004_または_c005_
変更する必要がある唯一のものにこれらのファイルのすべての名前を変更する必要があります。
文字は常にcです。

正規表現は非常に新しいので、この文字列を検索して置き換える正しい方法はわかりません。

私はこれまでのところ、このコードを書いているが、明らかにこれはスケーラブルではありません...
(それが唯一の04ではなく01から99に変更するので)

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

答えて

2

ConnorLSW's answerで先頭に追加これらの数字に置き換えて検索する方法を使用する方法を示します正規表現内のキャプチャグループ((...))と、置換文字列($1)でキャプチャしたものへの参照が目的の名前変換を実行します。

  • PowerShellは.NET Frameworkのregular-expression language、あなたのGet-Help about_Regular_Expressionsを実行するときに利用可能であるための簡単な紹介を使用しています。
    正規表現は、-replaceだけでなく、-match演算子およびSelect-Stringなどのコマンドレットでも使用されます。

  • 具体的には-replaceオペレータに適用される構文は、this answerの鉱山でカバーされています。それだけで新しいを計算するスクリプトブロックパラメータを使用していますRename-Item単一呼び出しが含まれるため

独自のソリューションの試みは、ConnorLSWの答えで%ForEach-Object)ベースのアプローチに好適です名。

Get-ChildItem | Rename-Item -NewName { $_.Name -replace '(?<=_c)(?=\d{2}_)', '0' } -WhatIf 
  • 共通パラメータ-WhatIf:ここ

    のみ0入力文字列の任意の部分を繰り返す必要なく、挿入されるべき位置と一致するzero-width lookbehind/ahead assertionsを使用して作業変化であります変更をプレビューします。それを削除して実際の名前変更を実行します。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 
} 

あなたがしていますおそらくこのような何かを探して、. sは任意の数字0-9ある_c.._に一致するものが、その後、0

関連する問題