みなさんこんにちは、テラド(@terashin1226)です!
Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
前回はコマンドレット:Rename-Itemでファイル名を変更する方法をお伝えしました。
今回はPowerShellで正規表現を使って複雑なファイル名変更をする方法をお伝えします。
正規表現…なんだか難しい言葉ですが、実はとっつきにくいのは名前だけです。この記事を読み終わるころには「なんだ正規表現ってそんなものか」と感じるはずですよ!
それではいってみましょう!
なぜ正規表現を使うのか
正規表現とは「文字列のパターンを記号で表現する時のルール」のことです。ではパターンを記号で表現すると、どんないいことがあるのか?そこが肝心ですよね。
正規表現は「検索・置換処理」をするときに大きな力を発揮します。
以下のような数値のグループがあったとしましょう。
「163-8001」
「999-9999-9999」
「99-9999-9999」
「163-8002」
正規表現で「数字3桁-数字4桁」というパターンを作ります。(具体的なパターンの作り方はあとでご説明いたします。)日本人ならおなじみの「郵便番号」のパターンですね。
このパターンで検索すると
「163-8001」
「163-8002」
と郵便番号のパターンに合致する文字列を抽出できます。
このように正規表現を使えば特定のパターンを見つけだすことが可能です。
Rename-Itemで正規表現を使う
前回紹介したファイル名を変更できるコマンドレット:Rename-Itemでは正規表現を使用することが可能です。
構文は以下の通りです。
Replace演算子で指定する置換前の文字列で正規表現が使用できます。
ファイル名の中から特定のパターンを見つけ出し置換することで、複雑なファイル名変更が実現できます。
「mm月dd日」形式のファイル名を「mmdd」に変更するスクリプト
では実際にスクリプトで正規表現を使ってみましょう。
オフィスの現場では日付のついたファイル名よく見ますよね。日付の形式を「mm月yy日」から「mmyy」に置換するスクリプトを作ってみたいと思います。
デスクトップのinputディレクトリにファイル名が「mm月dd日」のテキストファイルが入っています。
月、日ともに数字が1桁・2桁の場合が混ざっています。
ファイル名から月と日を除いて「mmyy」形式に変更します。「9月」や「1日」のように数字が1桁の場合は0を付与して2桁に揃えます。
一気に変更することも可能ですが、正規表現が複雑になるため
- 「m月」を「0m月」に置換
- 「d日」を「0d日」に置換
- 「mm月dd日」を「mmdd」に置換
と3段階で名称を変更していきます。
「m月」を「0m月」に置換する
1桁の「m月」を「0m月」に置換します。
スクリプトはこのようになります。
Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '^([0-9])月','0$1月'}
置換前の文字列に「^」や「[0-9]」といった記号が並んでいますね。これらをメタ文字といいます。メタ文字とは特別な意味を持たせたという記号のことです。
このスクリプトで使用しているメタ文字は文字の種類をグルーピングする「文字クラス」と文字の位置を指定する「アンカー」です。
文字クラス
文字クラスとは一致させたい文字の集まりを表すメタ文字の総称です。
文字クラスの1つである[0-9]を以下の太字の部分で使用しています。
[]内に記載した複数文字のいずれかに含まれる文字であればマッチさせることができます。
文字コード(ASCIIコード)が連続していれば[X-Y]のように「-(ハイフン)」で開始終了の文字だけ指定することができます。
文字コードの説明は割愛しますが、よく使うもので
- [A-Z]:AからZまでのアルファベット
- [0-9]:0から9までの数字
があります。
このスクリプトでは[0-9]を使用して数字であることを示しています。
[]内には複数文字を記載しますが、1文字を表現しているので注意してください。
アンカー
アンカーとは文字列が一致する位置を示すメタ文字の総称です。
アンカーの1つである「^」を文字クラス[0-9]の直前で使用しています。
「^」は文字列の先頭であることを示すメタ文字です。
「^([0-9])月」は先頭にある「m月」を指定しています。
このようにアンカーを使って月が1桁の場合のみ置換対象とします。
さて、文字クラスとアンカーを使って1桁の「m月」をマッチングすることができそうです。次に置換後の文字列を作っていきましょう。
ブロック化()
マッチングした先頭の「m月」に「0」を付与します。
置換前の月の数字(m)は、置換後の文字列でも使いたいですよね。
置換前の文字列を()でブロック化すると、置換後の文字列で参照することができます。
参照の方法は以下の通りです。
左のブロックから順番に「$1」、「$2」、「$3」…と指定することができます。
スクリプトでは月の左側にブロック()がありますね。月の数字[0-9]を囲っています。
置換後の文字列で$1と書くことで、()で囲った月の数字を参照することができます。$1の前に「0」を付けた文字列で置換します。
これで「m月」を「0m月」に置換することができます。
「d日」を「0d日」に置換する
次は「d日」に0を付与して「0d日」に置換します。
Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '月([0-9])日','月0$1日'}
さきほどの月を2桁に変換するスクリプトのアンカー「^」が「月」という文字に置き換わっているだけです。「月」に続いて「d日」である場合に置換対象としています。
「mm月dd日」形式を「mmdd」に置換する
ここまでで、1桁の月日には0が付与され、ファイル名はすべて「mm月dd日」形式になっているはずなので、これを一気に「mmdd」に置換します。
Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '([0-9][0-9])月([0-9][0-9])日','$1$2'}
ブロック化で月と日の2桁の数字([0-9][0-9])を置換後で参照し、「$1$2」とそのまま並べたものと置換します。
スクリプトを実行する
今まで作ったスクリプトをまとめて実行してみます。
意図しないディレクトリ内のファイル名が変更されないようにSet-Locationでカレントディレクトリを変更するのを忘れないようにしましょう。
Set-Location C:\Users\terad\Desktop\input Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '^([0-9])月','0$1月'} Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '月([0-9])日','月0$1日'} Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '([0-9][0-9])月([0-9][0-9])日','$1$2'}
inputディレクトリには月日が1桁と2桁の名称が混在していますね。
ISEで実行すると…
このようにmmddに変更されました!
(参考)代表的なメタ文字
PowerShellで使用できる代表的なメタ文字は以下の通りです。
メタ文字 | 説明 |
---|---|
. | 改行(\n、\r)を除くすべての文字 |
[X] | カッコ内の文字いずれか一文字 |
[X-Y] | 文字の範囲を指定 |
^ | 文字列の先頭を示す |
$ | 文字列の末尾を示す |
() | 置換前の文字列をグループ化し置換後の文字列で参照ができる |
* | 直前のパターンの0回以上繰り返す |
+ | 直前のパターンの1回以上繰り返す |
{min,max} | 直前のパターンをmin回からmax回繰り返す |
上記以外のメタ文字も含めクイックリファレンスにまとまっていますので詳細は下記のサイトをご参照ください。
まとめ
いかがだったでしょうか。
今回はPowerShellのRename-Itemで正規表現を使うことで複雑な名称変更をする方法をお伝えしました!
正規表現とはメタ文字という記号を使って文字列のパターンを表現したもので、置換したい文字列をパターンで指定すること複雑なファイル名変更が実現できます。
最後までお読みいただきありがとうございました!
連載目次:Windowsのポチポチ業務を爆速化するPowerShell
Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。- Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
- Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
- Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
- Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
- Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
- Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
- Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備
- Windowsのポチポチ業務を爆速化するPowerShell、フォルダを作るスクリプトの作り方
- Windowsのポチポチ業務を爆速化するPowerShell、if文を使いフォルダの有無で処理を分岐させる方法
- Windowsのポチポチ業務を爆速化するPowerShell、ForEach-Objectで配列の全要素を処理する方法
- Windowsのポチポチ業務を爆速化するPowerShell、パイプラインを使いコマンドレット間で値を引き渡す方法
- Windowsのポチポチ業務を爆速化するPowerShell、ファイルを別フォルダにコピーし名称を変更する方法
- Windowsのポチポチ業務を爆速化するPowerShell、ファイル名を変更する方法
- Windowsのポチポチ業務を爆速化するPowerShell、正規表現で複雑なファイル名変更をする方法
- Windowsのポチポチ業務を爆速化するPowerShell、タスクスケジューラでスクリプトを決まった日時に起動する方法
- Windowsのポチポチ業務を爆速化するPowerShell、ファイルをバックアップするスクリプトの作り方
- Windowsのポチポチ業務を爆速化するPowerShell、関数を作ってスクリプトから呼び出す方法
- Windowsのポチポチ業務を爆速化するPowerShell、関数をコンソールで登録して呼び出す方法
- Windowsのポチポチ業務を爆速化するPowerShell、短いワードでサッと関数を呼び出すエイリアスの使い方
- Windowsのポチポチ業務を爆速化するPowerShell、関数やエイリアス保存場所のドライブを紹介します
- Windowsのポチポチ業務を爆速化するPowerShell、elseifで日付の元号を判定する方法
- Windowsのポチポチ業務を爆速化するPowerShell、日付を操るDatetime型