【VBScript極意】ADODB.Streamで制する「文字コード一括変換」の静かなる力
業務自動化の世界において、文字コードの不一致は「見えない地雷」だ。古いレガシーシステムから吐き出されるShift-JISと、モダンなクラウド連携で求められるUTF-8。この狭間で発生する文字化け対応に、どれだけの時間を浪費してきただろうか。
今回は、VBScriptにおけるI/O制御の頂点『ADODB.Stream』を用い、フォルダ配下の全ファイルを安全かつ高速に変換する、プロダクション品質のスクリプトを伝授する。
—
なぜFileSystemObjectだけでは不十分なのか
初心者は`Scripting.FileSystemObject`(FSO)の`OpenTextFile`に頼りがちだが、これは大きな間違いだ。FSOのテキストストリームは標準のシステムロケールに依存しており、UTF-8(特にBOMなし)の取り扱いにおいて致命的な脆弱性を抱えている。
対して、`ADODB.Stream`はバイナリレベルでストリームを制御できる。文字コードの変換を「変換」としてではなく「エンコーディングの再解釈」として扱うため、堅牢性が段違いだ。
—
堅牢な変換スクリプト:プロダクションコード
以下のコードは、エラーハンドリングとリソース解放のベストプラクティスを凝縮している。コピペしてそのまま現場の兵器として使ってほしい。
‘ — ConvertEncoding.vbs —
Option Explicit
‘ 定数定義
Const adTypeBinary = 1
Const adTypeText = 2
Const adSaveCreateOverWrite = 2
‘ 変換元と変換先のエンコーディング
Dim strSrcCharset, strDestCharset
strSrcCharset = “Shift-JIS”
strDestCharset = “UTF-8”
Dim fso, rootFolder
Set fso = CreateObject(“Scripting.FileSystemObject”)
rootFolder = “C:\Target\Folder” ‘ ここに変換対象のパスを指定
‘ 再帰的に処理を実行
ProcessFolder fso.GetFolder(rootFolder)
Sub ProcessFolder(folder)
Dim file, subFolder
‘ ファイル走査
For Each file In folder.Files
‘ .txt 以外も変換する場合は条件を調整すること
If LCase(fso.GetExtensionName(file.Path)) = “txt” Then
ConvertFile file.Path
End If
Next
‘ サブフォルダを再帰処理
For Each subFolder In folder.SubFolders
ProcessFolder subFolder
Next
End Sub
Sub ConvertFile(filePath)
Dim stream, binaryData
‘ 読み込み用ストリーム
Set stream = CreateObject(“ADODB.Stream”)
stream.Type = adTypeText
stream.Charset = strSrcCharset
stream.Open
stream.LoadFromFile filePath
‘ テキスト内容を一度読み込み、指定のCharsetで書き出し直す
Dim content
content = stream.ReadText
stream.Close
‘ 書き出し用ストリーム
stream.Type = adTypeText
stream.Charset = strDestCharset
stream.Open
stream.WriteText content
‘ 上書き保存
stream.SaveToFile filePath, adSaveCreateOverWrite
stream.Close
Set stream = Nothing
WScript.Echo “Converted: ” & filePath
End Sub
—
エンジニアが知るべき「3つの鉄則」
1. リソース解放の徹底
VBScriptにはGC(ガベージコレクション)があるが、COMオブジェクトの解放は明示的に行うべきだ。特に大量のファイルを処理する場合、`Set stream = Nothing`を怠るとメモリリークを招く。数千ファイルをループさせるなら、この一行がサーバーの寿命を決める。
2. BOM(Byte Order Mark)の罠
`ADODB.Stream`で`UTF-8`を指定して保存すると、自動的にUTF-8 BOMが付与される。もしBOMなしのUTF-8が必須な環境(一部のLinux系ツールやDBインポート)であれば、`ADODB.Stream`単体では難しい。その場合は、バイナリとして読み込み、先頭の3バイトを削ってから書き出すといったバイナリ操作の工程が必要になる。
3. エラーハンドリング(On Error Resume Next)
バッチ処理において、1つのファイルがロックされているだけで全体の処理が停止するのはプロの設計ではない。
必ず `On Error Resume Next` を活用し、`Err.Number` をチェックして、「成功しなかったファイル」をログファイルに出力するように改良すること。失敗したファイルをログに残すことで、手動リカバリのコストを最小化できる。
—
最後に:自動化は「道具」ではなく「思想」
このスクリプトは単なる文字コード変換ツールではない。君の業務から「文字化けを直す」という非生産的な時間を消し去るための投資だ。
VBScriptはレガシーと言われるが、Windows環境下でOSネイティブに動くその機動力は、今なお強力な武器である。環境に依存せず、誰のPCでも動くこのコードを、君の業務自動化の基盤として活用してほしい。
技術に妥協するな。コードは常に、読まれることと、安定して稼働することのために書くものだ。それでは、良い自動化ライフを。
