値を計算して新しい名前に使用することで、ファイルのバッチ名前変更を行う

値を計算して新しい名前に使用することで、ファイルのバッチ名前変更を行う

名前を変更する必要がある JPG が数百個あります。各ファイル名の既存の番号に次の簡単な式を適用する必要があります。

(x-290)*-1

「Vitrine Hinge.0.jpg」は「Vitrine Hinge.290.jpg」になり、「Vitrine Hinge.1.jpg」は「Vitrine Hinge.289.jpg」になります。

問題となっているファイルの一部

私は以下を使用しました:

Dir *.jpg | ` foreach { $data = $_.name.Split(".") Rename-Item -NewName { '(' + $data1+ '-290)(-1)' } }

そしてエラーが発生します。

答え1

Ryan の回答は、新しいファイル名のベース名へのハード参照なしで機能するため、優れています。

私はいつも何らかの理由でファイル名を変更しており、PowerShell を使用して文字列を操作する独創的な方法を見つけました。これを行う別の方法を次に示します。

gci *.jpg | Rename-Item -NewName {$_.basename -replace "$($_.basename.split(".")[-1])$","$(290-$_.basename.split(".")[-1])$($_.extension)"}

このワンライナーは、jpg、gif、txt ファイルなど、他のファイルの名前を変更する場合にも再利用できます。唯一の要件は、ベース名の最後の部分が「.#」で終わることです。

では、ここで何が起こっているのでしょうか? 詳しく見てみましょう。$_ は現在、ファイル "Vitrine Hinge.12.jpg" の [System.IO.FileInfo] オブジェクトであるとします。つまり、次のようになります。

$_.ベース名

[文字列] "Vitrine Hinge.12" に等しい

$_.basename.split(".")

次のエントリを含む配列が生成されます。

Door Hinge
12

したがって、[1]は「12」を指します。ただし、代わりに以下を使用していることに注意してください。

$_.basename.split(".")[-1]

これは、「Viterine Hinge.Chrome.12.jpg」という名前のファイルがあった場合、「Chrome」を参照することになるからです。[-1] を使用すると、配列の最後の項目が返されるため、ファイル名に他のピリオドが含まれていても問題ありません。

さて、この時点で、それを $() でカプセル化し、-replace 演算子で使用します。最初の引数を $ で終わらせて、文字列の末尾で正規表現の一致が行われるように注意してください。この方法であれば、ファイル名に他の数字が含まれていても問題ありません。たとえば、「Viterine D00r Knob.0.jpg」はない「Viterine D290290r Knob.290.jpg」に名前が変更されます

何か見逃していたら教えてください。よろしくお願いします :)

答え2

このようなものが機能するはずです。

Get-ChildItem *.Jpg|%{$SplitName=$_.name -split '\.';$NewNumber= $(([int]$SplitName[1]-290)*-1);$NewName=@($SplitName[0],$NewNumber, $SplitName[2]) -join '.'; Rename-Item $_.name $Newname}

それはBreak Outだろう。

$Files=Get-ChildItem *.jpg
Foreach ($File in $files){
    $SplitName=$File.name -split '\.';
    $NewNumber= $(([int]$SplitName[1]-290)*-1)
    $NewName=@($SplitName[0],$NewNumber, $SplitName[2]) -join '.'
    Rename-Item $_.name $Newname
}

関連情報