2016-11-04 32 views
1

私はいくつかのコードを書いており、初めて正常に動作しました。しかし、私は今、新たなダミーファイルとファイルを交換してきたと私は今、次のようになっています:名前を変更してアイテムの名前を変更する

Get-ChildItem -Filter "*.prd" -Recurse | Rename-Item -NewName {$_.name -replace '.prd','_prd.prd'} 
Get-ChildItem -Filter "*.zip" -Recurse | Rename-Item -NewName {$_.name -replace '.zip','_zip.zip'} 
MyTestFile_prd.prd_prd.prdここ

に変更されMyTestFile_zip.zip_zip.zip MyTestFile.prdに変更され

MyTestFile.zipをコードです

この問題を回避する方法はありますか?

おかげ

+0

奇妙な、私のコンピュータ上のソリューションの作品 – Esperento57

答えて

2

-replaceオペレータ

  • は、その最初のオペランドとして正規表現を取り、
  • は、デフォルトでサブマッチングを行います。

したがって、あなたが意図したとおりの置換が機能するためには、最初のオペランドである正規表現変更する必要があります。

$_.Name -replace '\.prd$','_prd.prd' 
  • .を確認するために、\.としてエスケープさをものと-replace扱い、それをリテラル; \を除き、.と一致します。文字です。

  • $発現が入力のアンカーであることを保証し、すなわち、唯一の末尾にマッチします。

.prd.zipの両方をカバーし、より汎用的な再定式化:

$_.Name -replace '\.(prd|zip)$','_$1.$1' 

は、下記の説明を参照してください。正規表現の

Get-ChildItem -File *.prd, *.zip -Recurse | 
    Rename-Item -NewName { $_.Name -replace '\.(prd|zip)$','_$1.$1' } 

使用して一度に複数の拡張子を処理することを可能にする、ともあなたを許す:我々はすべて一緒にこれを置く場合

、我々は単一のパイプラインで逃げることができますキャプチャグループ(括弧内の部分式)の正規表現と一致する(キャプチャされた)部分を参照するには、$1(最初のキャプチャグループ、...)置換文字列に置換文字列で$1が参照方法

> @('example.zip', 'example.prd') -replace '\.(prd|zip)$','_$1.$1' 
example_zip.zip 
example_prd.prd 

注どのキャプチャ最初の入力のためのzip、及び第二のためにprdで捕捉基(prd|zip)、。

0

編集者注: それは余分な.を挿入するので、この答えは、手元にある特定の質問に対しては動作しません、それは一般的に、ファイルの拡張子を変更する堅牢な方法として[System.IO.Path]::ChangeExtension()の使用を示していますが。

また、ファイルの拡張子を変更するには、.NETメソッドを使用します。

Get-ChildItem -Filter "*.prd" -Recurse | Rename-Item -NewName {[System.IO.Path]::ChangeExtension($_.name,"_prd.prd")} 
関連する問題