【テクニカル・上級編】【文字コード一括変換】特定フォルダ配下の全テキストファイルを対象とした Shift-JIS と UTF-8 のバッチ変換処理 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

遺産を現代へ繋ぐ:ADODB.Streamによる文字コード一括変換の極致

レガシーなWindows環境において、文字コードの混在は「静かなる時限爆弾」だ。Shift-JISで書かれた古い設定ファイルと、UTF-8で統合された現代のシステム。この狭間でシステム管理者が流す汗を、私は数え切れないほど見てきた。

VBScriptは「枯れた技術」ではない。OSの深層に根ざし、外部依存なしで一撃で環境を制圧できる「究極のポータブルツール」だ。今回は、`ADODB.Stream`を駆使し、フォルダ配下の全ファイルを安全かつ高速に変換する、実戦仕様のスクリプトを授ける。

1. ADODB.Stream:低レイヤーを操る唯一の手段

なぜ `FileSystemObject (FSO)` ではなく `ADODB.Stream` なのか。FSOの `OpenTextFile` は、文字コード変換の柔軟性に欠け、BOM(Byte Order Mark)の有無で即座に沈没する。一方、`ADODB.Stream` はバイナリレベルでの読み書きを制御できるため、文字コードの変換レイヤーを明示的に指定可能だ。

核心となる設計指針

  • バイナリ・ストリームとしての運用: 読み込み後にバイナリとして保持し、エンコードを切り替えて再保存することで、変換ロスのリスクを排除する。
  • メモリの解放: VBScriptのガベージコレクションを信じるな。`Nothing`代入による明示的な参照解除は、数千ファイルを超える大量処理におけるメモリリークを防ぐための「礼儀」だ。

2. 実装:文字コード一括変換スクリプト

このスクリプトは、指定したルート以下の全ファイルを再帰的に探索する。運用現場でそのまま叩けるよう、あえて冗長なエラーハンドリングを削ぎ落とし、速度と堅牢性に特化させた。

‘ Usage: cscript.exe ConvertEncoding.vbs “C:\TargetFolder”
Option Explicit

Dim objFSO, objArgs
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objArgs = WScript.Arguments

If objArgs.Count = 0 Then WScript.Quit

Call ProcessDirectory(objArgs(0))

‘ 再帰的にフォルダを走査
Sub ProcessDirectory(strPath)
Dim objFolder, objFile, objSubFolder
Set objFolder = objFSO.GetFolder(strPath)

For Each objFile In objFolder.Files
‘ .txt 以外のファイルも必要に応じてここでフィルタリング
If LCase(objFSO.GetExtensionName(objFile.Name)) = “txt” Then
ConvertFile objFile.Path
End If
Next

For Each objSubFolder In objFolder.SubFolders
ProcessDirectory objSubFolder.Path
Next
End Sub

‘ ADODB.Streamを用いた変換処理
Sub ConvertFile(strFilePath)
Dim objStream
Set objStream = CreateObject(“ADODB.Stream”)

‘ 1. Shift-JISとして読み込み
objStream.Type = 2 ‘ adTypeText
objStream.Charset = “Shift-JIS”
objStream.Open
objStream.LoadFromFile strFilePath
Dim strContent
strContent = objStream.ReadText
objStream.Close

‘ 2. UTF-8 (BOMなし) として上書き保存
objStream.Charset = “UTF-8”
objStream.Open
‘ WriteTextで書き込むとUTF-8 BOMが付与される場合があるため、
‘ 純粋なUTF-8が必要な場合は、ここからバイナリ操作に切り替えるチューニングが必要
objStream.WriteText strContent
objStream.SaveToFile strFilePath, 2 ‘ adSaveCreateOverWrite
objStream.Close

Set objStream = Nothing
End Sub

3. シニアエンジニアが押さえるべき「罠」

このコードをそのまま本番環境に投入する前に、以下の3点だけは心に刻んでおいてほしい。

1. UTF-8 BOMの呪い: `ADODB.Stream` の `UTF-8` 設定は、デフォルトでBOMを付与する。もし連携先システムが「BOMなしUTF-8」を要求しているなら、書き込み時にバイナリデータとして `Position` を制御し、BOM分(3バイト)を削る処理を差し込む必要がある。
2. 実行権限とロック: 巨大なファイルを扱う際、対象ファイルがプロセスにロックされていないか監視せよ。`On Error Resume Next` を活用し、アクセス拒否されたファイルをログに吐き出す「堅牢なロギング機構」を付加するのが、真のプロフェッショナルの仕事だ。
3. パフォーマンスの限界: 数万ファイル単位の処理を行う場合、`WScript.Echo` で進捗を逐一出すのはI/O負荷となる。バッチ処理では、処理完了時にのみ結果をサマリー出力する設計が望ましい。

最後に

VBScriptは、もはや過去の遺物ではない。Windows環境下において、一切のインストール作業なしに、システム管理者の意思を直接OSへ伝えるための強力な武器だ。

このスクリプトを基点に、君自身の環境に合わせた「専用ツール」を組み上げろ。技術は使いこなしてこそ価値がある。何かわからないことがあれば、またこの場所へ来るといい。エンジニアとしての問いには、いつでも応えよう。

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