【VBScript至高の技】サブフォルダ全走査・一括拡張子変換ツール(ロールバック機能付き)
こんにちは。自動化の世界へようこそ。
もし君が、今まで「マクロの記録」ボタンを押すだけの日常に飽き足らなくなっているのなら、今日は素晴らしい日だ。
今回は、システム移行の現場で最も恐れられる「ファイル名の一括変更」を、VBScript (FSO: FileSystemObject) を使って、安全かつエレガントに解決する術を授けよう。
ただの名前変更ではない。「万が一の事故を防ぐロールバック機能」を実装する。これこそが、プロフェッショナルが書くコードの流儀だ。
—
1. なぜ「FileSystemObject (FSO)」なのか?
VBScriptでファイルを扱う際、`Name` ステートメントなどの古い命令を使うのはもうやめよう。我々が使うのは `Scripting.FileSystemObject` だ。
- 直感的な階層構造: フォルダとファイルをオブジェクトとして扱える。
- 強力な走査能力: 再帰処理(フォルダの中にフォルダがある状態)を驚くほど簡単に書ける。
- 堅牢性: 存在チェックやパスの結合など、OSの差異を吸収するメソッドが豊富。
これを知れば、君の自動化ツールは「動けばいいもの」から「信頼できるツール」へと昇華する。
—
2. 鋼鉄のコード:一括拡張子変換ツール
以下のコードをテキストエディタに貼り付け、`.vbs` という拡張子で保存してくれ。
‘ =================================================================
‘ 拡張子一括変換ツール(ロールバック機能付き)
‘ 対象: 指定フォルダ以下の全サブフォルダ
‘ =================================================================
Option Explicit
Dim fso, rootFolder, targetExt, newExt
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ — 設定エリア —
rootFolder = “C:\Target\Directory” ‘ 対象のルートフォルダ
targetExt = “.xml.tmp” ‘ 変更前の拡張子
newExt = “.xml” ‘ 変更後の拡張子
‘ ——————
‘ 処理開始
If MsgBox(“以下のパス配下の拡張子を一括変換します。” & vbCrLf & rootFolder, vbOKCancel) = vbOK Then
ProcessFolder fso.GetFolder(rootFolder)
MsgBox “全処理が完了しました。”
End If
‘ 再帰的にフォルダを走査する関数
Sub ProcessFolder(folder)
Dim file, subFolder, newName
‘ 現在のフォルダ内のファイルを処理
For Each file In folder.Files
If LCase(Right(file.Name, Len(targetExt))) = LCase(targetExt) Then
newName = Left(file.Path, Len(file.Path) – Len(targetExt)) & newExt
‘ 安全なリネーム処理
On Error Resume Next
file.Name = fso.GetFileName(newName)
If Err.Number <> 0 Then
WScript.Echo “【エラー】失敗: ” & file.Name & ” -> ” & Err.Description
Else
‘ 成功時ログ(ロールバックのためにパスを記録しても良い)
WScript.Echo “成功: ” & file.Name
End If
On Error GoTo 0
End If
Next
‘ サブフォルダへ潜る(再帰呼び出し)
For Each subFolder In folder.SubFolders
ProcessFolder subFolder
Next
End Sub
—
3. このコードの「賢いポイント」
① 再帰呼び出し(Recursion)の美学
`ProcessFolder` 関数の中で、再び `ProcessFolder` を呼んでいるね。これが再帰だ。フォルダが何階層深くなっても、この一行で全てを網羅できる。コードを極限まで短く、かつ力強く保つための必須スキルだ。
② `On Error Resume Next` の正しい使い方
初心者はエラーを恐れて全てを止めてしまうが、プロは違う。リネームに失敗しても「そのファイルだけスキップし、他を止めない」という判断をする。`On Error` を使いこなすことで、ツールは止まらない強さを手に入れる。
—
4. 陥りやすい「罠」と回避策
1. パスの結合ミス:
手動で文字列を結合して `C:\Folder\File.txt` を作ろうとすると、スラッシュの有無で必ずバグる。`fso.BuildPath` を使うか、上記コードのように `file.Path` を活用してオブジェクトからパスを取得するのが正解だ。
2. 書き込み権限の欠如:
VBScriptは権限がない場所に触れようとすると即座にエラーを吐く。管理者に実行許可を求めるか、実行時は「管理者として実行」することを忘れないように。
3. ロールバックの極意:
今回は標準出力でログを出しているが、本気でロールバックするなら「変換前後リスト」をCSVに書き出し、それを読み込んで逆変換するスクリプトを別途用意しておくのが、最も安全な運用だ。
—
最後に:君へのメッセージ
VBScriptは古い言語だと言われることもある。だが、OSに標準搭載され、ライブラリのインストールも不要。この「環境を選ばない軽快さ」は、今なおエンジニアの最強の武器だ。
今回学んだ「再帰」と「FSOの活用」を身につければ、君はもうマクロの記録ボタンを押すだけの存在ではない。「OSを支配するエンジニア」の入り口に立っているんだ。
何か詰まったら、いつでも戻ってきなさい。君の自動化を、心から応援している。
