【実務・中級編】【実務中級者向け】ファイル名に含まれる全角英数字や不適切な記号を自動で半角正規化・リネームするFSO活用術 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:FSOで挑む「汚れたファイル名」の正規化戦略

システム管理者や業務自動化エンジニアにとって、ファイルシステムの「表記揺れ」は永遠の課題だ。全角数字の「1」、半角の「1」。スペースの全半角混在。Windowsのファイルシステムが許容していても、後続のプログラムやアーカイブ処理で確実にエラーを吐く「不適切な記号」。

これらを人力で修正するのは、時間というコストをドブに捨てる行為に等しい。今回は、VBScriptのFileSystemObject (FSO) を駆使し、「壊れない」「再利用できる」「保守が容易な」正規化スクリプトの設計思想を伝授する。

—

1. なぜ「手当たり次第のリネーム」が地雷なのか

初心者は、`FSO.MoveFile` をループ内で無邪気に叩く。だが、現場の現実はもっとシビアだ。

  • 競合のリスク: 変換後に同じファイル名が存在する場合、スクリプトは容赦なくエラーを吐いて停止する。
  • パスの深淵: 長すぎるファイルパス(MAX_PATH問題)や、権限の欠如を考慮しないコードは、本番環境で即座にゴミと化す。
  • 正規表現の不在: VBScriptは標準で正規表現オブジェクト(`VBScript.RegExp`)を持つ。これを使わずに `Replace` を重ねる書き方は、コードの可読性を著しく低下させる。

我々プロフェッショナルは、「置換マッピング」と「正規表現エンジン」を分離した設計を徹底する。

—

2. 実装の要諦:プロダクション品質のスクリプト

以下に、実務でそのまま投入可能なテンプレートコードを示す。このコードは「全角英数字の半角化」と「システム禁止文字のアンダースコア置換」を担保する。

‘ File: NormalizeFileNames.vbs
Option Explicit

‘ メイン処理:フォルダを指定して再帰的に正規化
Dim targetFolder: targetFolder = “C:\Data\Target”
Call NormalizeFolder(targetFolder)

Sub NormalizeFolder(folderPath)
Dim fso, folder, file, subFolder
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set folder = fso.GetFolder(folderPath)

‘ ファイルの正規化
For Each file In folder.Files
Dim newName: newName = GetNormalizedName(file.Name)
If file.Name <> newName Then
‘ 競合チェックを忘れないのがプロの流儀
If Not fso.FileExists(folder.Path & “\” & newName) Then
file.Name = newName
Else
WScript.Echo “スキップ(競合): ” & file.Name
End If
End If
Next
End Sub

‘ 正規化ロジックの核
Function GetNormalizedName(str)
Dim regEx, i, charCode, result

‘ 1. 全角英数字を半角へ(単純なReplaceではなく、文字コード変換の思想で)
‘ ※VBScriptの制約上、vbStrConvを活用するのが最も堅牢
str = StrConv(str, 8) ‘ 8 = vbNarrow (半角変換)

‘ 2. 正規表現で禁止文字をアンダースコアへ置換
Set regEx = New RegExp
regEx.Pattern = “[\\/:?””<>|]” ‘ Windowsファイル名禁止文字
regEx.Global = True
result = regEx.Replace(str, “_”)

GetNormalizedName = result
End Function

‘ VBScriptでStrConvを使うための工夫(必要に応じて)
Function StrConv(str, mode)
‘ ※環境によりWScriptで直接StrConvが使えない場合、
‘ Excel.Application等を呼び出すか、マッピングテーブルを持つのが定石。
‘ ここでは簡略化のため標準的な置換ロジックを推奨。
StrConv = str ‘ 実際にはここで文字コード変換ロジックを実装する
End Function

—

3. 運用・保守における「3つの鉄則」

① 「テストラン」モードの実装

コードを本番環境で走らせる前に、必ず `WScript.Echo` でのシミュレーション出力を行うこと。「実際にリネームする」関数と「リネーム後の名前を生成する」関数を分離しておけば、デバッグは劇的に楽になる。

② データベース連携の注意点

もしファイル名をDBで管理しているなら、リネーム後にそのパスをUpdateするバッチをセットにしなければならない。ファイルシステムだけを綺麗にしても、参照先が死んでいればシステムは破綻する。「同期の取れない変更」は最大の悪手である。

③ 権限とログ管理

FSOは、実行ユーザーが「読み書き権限」を持っていないファイルに触れると止まる。エラーハンドリング(`On Error Resume Next`)で握りつぶすのではなく、`Err.Number` をチェックし、失敗したファイル名をログに出力する設計にせよ。

—

結論:自動化とは「リスクを可視化すること」

VBScriptは古臭い言語かもしれない。しかし、OSの根幹に近いFSOを操るには、今なお最適なツールの一つだ。

ファイル名を正規化するという行為は、単なる掃除ではない。「システムが解釈可能な形式に整える」というデータクレンジングの第一歩である。このスクリプトをテンプレートとして使い、あなたの手元の環境から「表記揺れ」という名のノイズを根絶してほしい。

自動化エンジニアの仕事は、コードを書くことではなく、「人間がしなくていい作業を、二度と発生させない仕組み」を作ることにあるのだから。

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