多数のフォルダ名に共通する特定の文字列を一括置換する機会があったので、一連の処理をバッチファイル化した過程を備忘録的に残します。
まず最終的にできたコマンドがこちら。
CHCP 65001
Powershell -command "$oldText = '変換元テキスト'; $newText = '変換後テキスト'; Get-ChildItem -Directory | Where-Object { $_.Name -match $oldText } | Rename-Item -NewName { $_.Name -replace $oldText, $newText }"
以下、処理の解説です。
CHCP 65001
先にCHCPで文字コードを変更します。
フォルダ名が日本語を含む場合、UTF-8の65001を指定。
英文字のみの場合はShift-JISの932がデフォルトで設定されているので、何もしなくて大丈夫です。
今回日本語を含むフォルダを内包する可能性があったので、UTF-8として読ませるようにしました。
Powershell -command "$oldText = '変換元テキスト'; $newText = '変換後テキスト'; Get-ChildItem -Directory
次にPowershellのコマンドでファイル名をリネームするため、**Powershell -command “~~~”**でPowershell用のコマンドを実行します。
まずoldText、newTextの変数を定義し、Get-ChildItemでカレントディレクトリのファイル、フォルダ情報をコレクション(配列のようなモノ)で取得します。
さらに今回はフォルダ名のみ変えるつもりなので、-Directory属性を付与。
Where-Object { $_.Name -match $oldText }
その後、Where-Objectコマンドを使って、先ほど取得したコレクションに対して比較演算で抽出を行ないます。
ファイル、フォルダ情報としてMode, LastWriteTime, Length, Nameが使えるので、そのうちのNameを使って**-match**比較演算子 (文字列に対しての==のようなもの) を使います。
ちなみにPowershell v3以降は Where-Object Name -match $oldText のようにブロック記号 {} とパイプライン変数 $_ を省略して書けるみたいなので、活用していきましょう。
パイプライン変数とは、一部のプログラミング言語で言う反復子アクセスできるものだと思って大丈夫です。
Rename-Item -NewName { $_.Name -replace $oldText, $newText }
次に’Rename-Item’コマンドを使ってoldTextからnewTextへの置換を行ないます。
これで処理の説明は終わりです。
最後に名前置換したいフォルダ群が存在するディレクトリに、このバッチファイルを置いてダブルクリック実行でOK。
コマンドプロンプトのバッチファイルは管理者実行すると実行ディレクトリが変わるみたいなので注意してください。
(Powershellはどちらも実行ディレクトリを保ってくれるらしい)