【PowerShell】Rename-Itemで一括リネーム チートシート

翻訳が終わったファイルには言語名や作業者名、作業済のマークなどをつけて別名保存することが多いと思います。

しかしファイル数が10とか20とかあると、一つずつ手作業するのも面倒です。
さてそんなわけでPowerShellに頑張ってもらいましょう。

今回は下記のとおり01~20までのWordファイルを準備しました。


Rename-Itemを使う

PowerShellでファイル名を変更するにはコマンドレット Rename-Item を使います。
読んで字のごとし、項目名(ここではファイル名)を変更するものです。

Linuxでは mv でリネームすることが多いと思いますし、実際PowerShellでも Move-Item で同じことができるのですが、
せっかく専用のコマンドレットがあるのでこちらを使いましょう。 

Rename-Item <元のファイル名> <新しいファイル名>

Copy-Itemなどと違って、Rename-Itemは一回につき一つのファイルしか処理できません。

そこで出番となるのがファイル名(FileInfoオブジェクト)を一括で取得できる Get-ChildItem パイプ(|)
それから順番に処理を実行する ForEach-Object です。

Get-ChildItemと組み合わせ

先に実行するコマンドレットを記載しておきます。

Get-ChildItem -File | ForEach-Object {Rename-Item $_  <新しいファイル名>}

ForEach-Object で処理対象となるオブジェクトは $_ という変数でアクセスすることができます。

これで一つずつしか処理できない Rename-Item をファイルの数だけ繰り返すことができるようになりました。

次は新しいファイル名についてです。

新しいファイル名の書き方

<新しいファイル名> とあるところに入力すればいいのですが、直接文字列を打ち込んでしてしまうと、
すべて同じファイル名になってエラーが出てしまいます。

そのため、新しいファイル名も $_ を使って記述するのがよいでしょう。

ファイル名の先頭につける場合は比較的簡単です。

Get-ChildItem -File | ForEach-Object {Rename-Item $_  ("DONE-" + $_)}

コマンドレットの引数はスペースで区切って認識されるため、”DONE-” + $_ には括弧() をつけるのを忘れずに!

それでは、ファイル名の後ろにつける場合はどうでしょうか。

まずは同じようにやってみましょう。

Get-ChildItem -File | ForEach-Object {Rename-Item $_  ($_ + "-DONE")}

この結果は次の画像のようになります。

[System.IO.FileInfo] に 'op_Addition' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。

[System.IO.FileInfo] に ‘op_Addition’ という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
というエラーがファイルの数だけ表示されます。

説明をすると細かくなってしまうのですが、PowerShellは違う型の演算で、左側の方を優先するようです。

「文字列+FileInfoオブジェクト」であれば文字列に対する「+」演算になるのですが、
「FileInfoオブジェクト+文字列」では「FileInfoオブジェクト」に対する「+」演算と解釈されてしまい、
それが定義されていないため、上記のエラーになるのです。

この場合、少し工夫が必要です。

FileInfoオブジェクトのプロパティを活用

単に Get-ChildItem -File としたときに表示されるFileInfoオブジェクトは、ファイル名以外にも多くの情報があります。

それと同様に、パイプで渡された変数 $_ もファイル名以外の情報を持っています。
これを活用しましょう。

Get-ChildItem -File | ForEach-Object {Rename-Item $_  ($_.BaseName + "-DONE" + $_.Extension)}

BaseNameで拡張子以外の名前を、Extensionで拡張子をそれぞれ取得できます。

いずれも文字列型のため、問題なく「+」演算子を使用できます。

あとはその間に”-DONE”という文字列を入れればOKです。

エイリアスで入力スピードアップ

最後に、エイリアスを活用したスピードアップ例を紹介します。

Rename-Itemにも rni という大文字を一つずつ取ったエイリアスが準備されています。

また、ForEach-Objectのエイリアスは %記号 です。

これらをまとめてみます。

gci -File | % {rni $_  ($_.BaseName + "-DONE" + $_.Extension)}

ずいぶん短くなりましたね。

BaseNameやExtensionといったプロパティにはエイリアスがないものの、
タブキーによる入力補完は可能なので、数文字だけ打ち込んで後は自動入力するようにしましょう。

これで翻訳・校正ファイルのリネームも素早くできるようになります。

CATOVIS LS

MS Office Wordと接続。軽量型でWYSIWYGを実現