noise

計算機科学や各種設定のメモ

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と同等の処理を行う関数を定義しました。