【入門編】【複数ファイル一括リネーム】正規表現グループ置換を用いた連番付与および特定文字列のパターン一括変換 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!VBScriptの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩抜け出し、自分の手でWindowsの環境を自在にコントロールしたい——そんな知的好奇心にあふれるあなたを、今日は最高にエキサイティングな自動化の世界へご案内します。

今回のテーマは「正規表現グループ置換を用いた複数ファイルの一括リネーム」です。
「ファイル名に含まれる日付の順序を入れ替えたい」「特定のパターンにマッチした部分だけを抜き出して、連番を振りたい」……そんな現場の面倒な手作業を、たった数行の洗練されたVBScriptで瞬時に終わらせてしまいましょう。

ここをクリアすれば、あなたも立派なWSH(Windows Script Host)マスターの仲間入りです。さあ、一緒に本質を学んでいきましょう!

なぜVBScriptなのか? 現場で生きる「究極の軽量スクリプト」

今やPythonやPowerShell全盛の時代ですが、なぜ今さらVBScriptなのか?
答えはシンプルです。「Windowsさえあれば、何もインストールせずに、今日この瞬間から動くから」です。

企業の厳格なセキュリティ環境では、新しいツールのインストールやランタイムの導入には高いハードルがあります。しかし、VBScriptはWindowsの標準機能(WSH)。メモ帳さえあれば書けて、ダブルクリックするだけで動く。この「ノーセットアップの機動力」は、現場のエンジニアにとって最強の武器なのです。

今回は、VBScriptの真骨頂である以下の2大エンジンを組み合わせます。
1. `Scripting.FileSystemObject` (FSO):ファイルの検索・存在確認・リネームを司る守護神。
2. `VBScript.RegExp`:強力なパターンマッチングと「キャプチャグループ」による置換を司る魔術師。

この2つを正しく手なづければ、ファイル操作で怖いものはありません。

今回作成するスクリプトの全貌

まずは、実際に現場でそのままコピペして使える完全版のコードをお見せします。
デスクトップなどに `rename_tool.vbs` という名前で保存し、中身をメモ帳で書き換えて使ってください。

‘ =================================================================00
‘ 意図しない破壊を防ぐための安全宣言
‘ =================================================================変数の宣言を強制し、タイポによるバグを根絶します
Option Explicit

Dim fso, regEx, targetFolder, targetExt
Dim folder, file, originalName, newName
Dim matchCollection, match
Dim counter

‘ — 【設定エリア】ここはご自身の環境に合わせて書き換えてください —
targetFolder = “C:\Work\TargetFiles” ‘ 対象のフォルダパス(末尾の\は不要)
targetExt = “txt” ‘ 対象とする拡張子(ドットなし)
‘ ——————————————————————-

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ フォルダの存在確認
If Not fso.FolderExists(targetFolder) Then
MsgBox “指定されたフォルダが存在しません:” & vbCrLf & targetFolder, vbCritical, “エラー”
WScript.Quit
End If

Set folder = fso.GetFolder(targetFolder)
counter = 1 ‘ 連番の初期値

‘ 正規表現エンジンのセットアップ
Set regEx = New RegExp
‘ 【ルールの例】
‘ 検索パターン: “report_(\d{4})-(\d{2})-(\d{2})\.txt”
‘ キャプチャグループ1: 年, グループ2: 月, グループ3: 日
regEx.Pattern = “^report_(\d{4})-(\d{2})-(\d{2})\.” & targetExt & “$”
regEx.IgnoreCase = True 大文字小文字を区別しない
regEx.Global = False

MsgBox “リネーム処理を開始します。”, vbInformation, “確認”

‘ フォルダ内のファイルをループ処理
For Each file In folder.Files
originalName = file.Name

‘ ファイル名が正規表現パターンにマッチするかチェック
If regEx.Test(originalName) Then

‘ 【グループ置換の魔術】
‘ $1, $2, $3 はそれぞれ正規表現の括弧 () でキャプチャした中身を指します。
‘ 例: report_2023-10-25.txt -> 2023年10月25日_ファイル001.txt に変換
‘ ゼロ埋めされた連番(FormatNumber等を使っても良いですが、今回はシンプルに)
Dim paddedIndex
paddedIndex = Right(“000” & counter, 3)

‘ 置換パターンの定義 ($2=月, $3=日, $1=年 + 連番)
newName = regEx.Replace(originalName, “$2月$3日_data_” & paddedIndex & “.” & targetExt)

‘ 【安全装置:同名ファイルの競合チェック】
Dim destinationPath
destinationPath = targetFolder & “\” & newName

If fso.FileExists(destinationPath) Then
MsgBox “警告: 変換後のファイル名が既に存在するためスキップしました。” & vbCrLf & newName, vbExclamation, “競合スキップ”
Else
‘ ファイルのリネーム実行
file.Name = newName
counter = counter + 1
End If

End If
Next

‘ オブジェクトの解放(メモリのクリーンアップ)
Set regEx = Nothing
Set folder = Nothing
Set fso = Nothing

MsgBox “処理が完了しました!合計 ” & (counter – 1) & ” 件のファイルをリネームしました。”, vbInformation, “完了”

コードの核心を紐解く:3つの重要ポイント

ここからは、なぜこのコードが美しく、そして安全に動くのかをエンジニアの視点で解説していきます。

1. `Option Explicit` による厳格な変数宣言

VBScriptはデフォルトでは変数を宣言せずにいきなり使うことができます(暗黙の宣言)。しかし、これは大規模なスクリプトを書く際にはバグの温床になります。「`targetFolder`」と「`targetFolder`」というタイポ(打ち間違い)に気づけず、意図しない挙動を引き起こすからです。
先頭に `Option Explicit` を書くことで、「すべての変数は `Dim` で宣言しなさい」とVBScriptに強制させることができます。プロフェッショナルへの第一歩は、ここから始まります。

2. 正規表現の「キャプチャグループ(, …)」の仕組み

今回のテーマのキモがここです。正規表現の中で丸括弧 `()` を使うと、そこにマッチした文字列を「記憶(キャプチャ)」させることができます。

例えば、ファイル名が `report_2023-10-25.txt` だったとします。
パターンを `^report_(\d{4})-(\d{2})-(\d{2})\.txt$` とすると:

  • `$1` には `2023` が入る
  • `$2` には `10` が入る
  • `$3` には `25` が入る

置換先の文字列を指定するときに `”$2月$3日…”` と書くだけで、抽出したパーツを自由な順番で組み替えて新しいファイル名を作ることができます。これが、ただの置換(Replace)とは違う、正規表現グループ置換の圧倒的な強みです。

3. FSOによる「安全装置(競合チェック)」

自動化スクリプトで最も恐ろしいのは、「同名のファイルが存在していて上書きしてしまい、大切なデータを吹き飛ばしてしまうこと」です。
マクロの記録や単純なバッチファイルでは、このチェックがおろそかになりがちです。しかし、私たちのコードでは `fso.FileExists(destinationPath)` を挟むことで、もし同名ファイルが既に存在する場合は処理をスキップし、安全性を担保しています。
「動けばいい」ではなく、「壊れない」スクリプトを書く。これがプロの仕事です。

陥りやすい罠とトラブルシューティング

実際にコードを触っていると、初心者が必ずと言っていいほどハマるポイントがあります。ここで事前に予習しておきましょう。

  • 罠1:エスケープ文字の扱いでエラーになる
  • 正規表現の中でドット `.` は「任意の1文字」を意味する特殊文字です。そのため、ファイルの拡張子のドットを指定するときは `\.txt` のようにバックスラッシュ(VBScriptでは円マーク `\`)でエスケープする必要があります。
  • 罠2:ファイルがロックされていてリネームできない
  • Excelやテキストエディタで対象のファイルを開いたままスクリプトを実行すると、Windows側から「アクセスが拒否されました」というエラー(エラー番号:70)が返されます。処理の前には必ず該当ファイルを閉じましょう。

ここをクリアすれば、VBScriptの基本はバッチリです!

お疲れ様でした!
FileSystemObjectによるファイルシステムへのアプローチと、RegExpによる高度な文字列操作、そして実務に耐えうるエラーハンドリング。これらを組み合わせたあなたは、もはや単なる「VBScriptの初心者」ではありません。

「こんな面倒なファイル整理、いつも何時間もかけて手作業でやってたよ……」
もしそう感じたなら、自動化エンジニアとしての第一歩を踏み出した証拠です。

ここをクリアできれば、VBScriptの基本はバッチリです。ぜひ、ご自身の業務に合わせてパターンを書き換え、日々の面倒なタスクを次々と自動化してみてください。あなたのエンジニアライフが、より知的で快適なものになることを応援しています!

タイトルとURLをコピーしました