Powershellでファイル名の一括変換を行う

仕事でファイル名の変換を行うことが良くあります。特に経理の仕事をしていると、月次決算が始まる前に大量のExcelファイルを新しい月度にコピーしてファイル名を変更する作業が発生します。

私は過去にファイル名を変更し忘れてファイルの新旧が分からなくなり、本来必要だったファイルを削除したことがあったので、それ以来、ファイル名の変更はきちんとするように心がけています。決算が始まってから忙しくなるとファイル名を変える時間も惜しくなるので、事前準備として名前を変えることは必須の業務です。

ただし、ファイルの数が多くなると手で1つ1つ変更するのは大変なのでPowerShellを使ってフォルダ内のファイルを一括変換の方法を覚えましょう。

ファイル名の変換

下図のようにフォルダXにファイルが25個あり、これらのファイル名の1711を1712に変換してみましょう。

まずはPowerShellを起動しましょう。いつも通りスタートメニューから起動してもいいですが、Windows10では【ファイル】を選ぶと、【Windows PowerShellを開く(R)】メニューが用意されているので、これを選択してください。すると、開いているフォルダをカレントディレクトリとしてPowerShellが起動します。

PowerShellが起動したら以下のコマンドを打ちます。

ls | Rename-Item -NewName { $_.Name -replace '1711', '1712'}

一瞬で25個のファイル名が1711から1712に変更されました。この方法ならば、どれだけファイルがあっても一瞬で変換作業を終えてくれます。

もし対象フォルダ内に子フォルダがある場合、エラーが発生するのでlsコマンドに-fileオプションを付けてから実行してください。

ls –file | Rename-Item -NewName { $_.Name -replace '1711', '1712'}

再帰的にフォルダの子フォルダ(さらに子フォルダ・・・も含む)のファイルも名称変換の対象にしたい場合、-Recurseオプションを付けて実行してください。その場合、-fileオプションも合わせて指定します。

ls –file -Recurse | Rename-Item -NewName { $_.Name -replace '1711', '1712'}

変換対象を限定する

フォルダの中にあるすべてのファイルではなく、特定のファイルの名前を変換対象にしたい場合を考えます。例えば’A’から’L’のファイルだけ、名前を変換したい場合は次のようになります。

ls -include *[A-L]* | Rename-Item -NewName { $_.Name -replace '1711', '1712'}

Rename-Itemにファイルのリストを渡す前に、あらかじめAからLのファイル名だけのリストを作ればよいのです。

lsはGet-ChildItemのエイリアスとなっており、-includeオプションは特定のファイル名を含めたい場合に使用します。逆に特定のファイル名を除外する場合には、-excludeオプションを使ってください。

まとめ

ファイル名の変更機能は初歩的なプログラムで実現できますが、実際の業務でも役に立つ場面が多いためいつでも使えるようにしておくと便利です。2,3個のファイル名を変更する場面では手作業の方が早いのですが、ファイル名を打ち間違える恐れがないのでPowerShellでまとめて変換した方がミスは少なくなるはずです。