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

スポンサーリンク

VBScriptで操るファイル名正規化:FSOと正規表現の「黄金の組み合わせ」

こんにちは。現場で日々、泥臭い自動化と格闘しているエンジニアです。

「ファイル名が全角だったり半角だったりして、システム連携でエラーになる」「ファイル名に禁止文字が入っていてバックアップが止まる」。そんな悩み、一度は経験しますよね。

今回は、VBScriptを使って「混沌としたファイル名を、美しく整った半角英数字へ強制的に正規化する」という、実務で死ぬほど役立つテクニックを伝授します。マクロの記録から一歩踏み出し、OSの深淵を操るエンジニアへの第一歩を一緒に踏み出しましょう。

—

なぜ「FSO」と「正規表現」なのか

VBScriptでファイル操作を行う際、避けて通れないのが FSO (FileSystemObject) です。これはWindowsが提供する、ファイルシステムをオブジェクトとして扱うための強力なインターフェース。

そして、複雑な文字列パターンを判定・置換するのに不可欠なのが VBScript.RegExp (正規表現エンジン) です。この2つを組み合わせることで、OSの制限を華麗にかわしつつ、高速にファイル名を書き換えるアーキテクチャが完成します。

—

実践:全角英数字・禁止文字を排除するスクリプト

以下のコードは、指定フォルダ内の全ファイルを走査し、全角英数字を半角へ、禁止文字をアンダースコア(`_`)へ置換する「実務直結型」のスクリプトです。

‘ — リネーム処理のメインロジック —
Dim fso, folder, file, regEx
Dim targetPath, newName

targetPath = “C:\TargetFolder” ‘ 処理対象のパス

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set regEx = CreateObject(“VBScript.RegExp”)

‘ 正規表現の設定:全角英数字をキャッチし、変換ロジックを組む
‘ ここでは簡易的に「全角を半角に変換する関数」を併用するのが現場の定石
If fso.FolderExists(targetPath) Then
Set folder = fso.GetFolder(targetPath)

For Each file In folder.Files
‘ ファイル名から拡張子を除いて正規化
Dim baseName, ext
baseName = fso.GetBaseName(file.Name)
ext = fso.GetExtensionName(file.Name)

‘ 正規化ロジックの呼び出し
newName = NormalizeString(baseName) & “.” & ext

‘ 変更が必要な場合のみリネーム
If file.Name <> newName Then
file.Name = newName
WScript.Echo “Renamed: ” & file.Name & ” -> ” & newName
End If
Next
End If

‘ — 文字列正規化のヘルパー関数 —
Function NormalizeString(str)
Dim i, charCode, result
result = “”
‘ 全角英数(65248)を半角に変換するロジック
For i = 1 To Len(str)
charCode = AscW(Mid(str, i, 1))
If charCode >= 65296 And charCode <= 65305 Then ' 全角数字 result = result & Chr(charCode - 65248) ElseIf charCode >= 65313 And charCode <= 65338 Then ' 全角大文字 result = result & Chr(charCode - 65248) ElseIf charCode >= 65345 And charCode <= 65370 Then ' 全角小文字 result = result & Chr(charCode - 65248) ElseIf InStr("\/:?""<>|”, Mid(str, i, 1)) > 0 Then ‘ 禁止文字
result = result & “_”
Else
result = result & Mid(str, i, 1)
End If
Next
NormalizeString = result
End Function

—

挫折しないための「深層ポイント」3選

1. オブジェクトの解放を忘れるな

VBScriptはメモリ管理が甘くなりがちです。`Set fso = Nothing` を最後に行うのが流儀ですが、もっと重要なのは「ループ内で何度もオブジェクトを生成しないこと」です。上記のコードのように、ループの外で一度だけインスタンス化するのが、パフォーマンスを落とさないコツです。

2. 「AscW」と「Asc」の使い分け

VBScriptには `Asc` と `AscW` があります。Unicodeを扱う現場では、迷わず `AscW` を選んでください。`Asc` はシステムのコードページに依存するため、文字化けや意図しない変換の温床になります。

3. 禁止文字は「置換」が鉄則

システム禁止文字(`\ / : ? ” < > |`)を削除してしまうと、ファイル名が空になったり、拡張子が消失したりするリスクがあります。「削除」ではなく「置換(アンダースコアへの変換)」を行うのが、トラブルを未然に防ぐアーキテクトの思考です。

—

最後に:自動化は「愛」です

「ファイル名を整える」という行為は、単なる事務作業ではありません。後からそのデータを使う誰か、あるいは半年後の自分に対する「思いやり」です。

今日からこのスクリプトをテンプレートとして使い、あなたの手元の「混沌」を「秩序」に変えていってください。何かエラーで詰まったら、それはOSとの対話のチャンスです。応援していますよ!

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