PowerShellで連番のファイル名の変換
目的
写真の整理用
ソースコード
function getnum($obj) { return ($obj.name -replace "hoge_(\w+).jpg",'$1') } ls | ?{ (getnum $_) -as [int]} | %{ move-item -literalpath ($_.fullname) -destination ((split-path $_.fullname) + "\{0:D4}.jpg" -f [int](getnum $_)) }
所感
- Rename-Item コマンドレットを用いてリネームしようとした場合、ファイルパスに各括弧(Square Bracket)があるとエラーになる。
- それを回避するために Move-Item コマンドレットの LiteralPath オプションを使用する必要があった。
なぜ Rename-Item には LiteralPath オプションがないのか?
追記
version 3.0 からはLiteralPathオプションが実装されているようです。
追記
function getnum($obj) { return ($obj.name -replace "test\[2014\]_(\w+).txt",'$1') } function rename([System.IO.FileSystemInfo]$obj, [string]$newname, [switch]$whatif) { $params = @{} if($whatif) { $params["whatif"] = $Null } move-item -LiteralPath $obj.FullName -destination ((split-path $obj.fullname) + "\$newname") @params } ls | ?{ (getnum $_) -as [int]} | %{rename $_ ("after[2014]_{0:D4}.txt" -f [int](getnum $_))}
version 4.0 でも動かないようなのでrenameと同等の処理を行う関数を定義しました。