【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' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。](https://i1.wp.com/catovis.com/wp-content/uploads/2020/12/image-19.png?resize=905%2C102&ssl=1)
[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といったプロパティにはエイリアスがないものの、
タブキーによる入力補完は可能なので、数文字だけ打ち込んで後は自動入力するようにしましょう。
これで翻訳・校正ファイルのリネームも素早くできるようになります。

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