混沌を秩序へ:FSOによるファイル自動分類アーキテクチャの真髄
業務自動化の現場において、VBScriptは「枯れた技術」と揶揄されることがある。だが、OSにネイティブで実装され、コンパイル不要で即座に展開できるこの言語は、小規模なタスクオートメーションにおいては未だ最強の武器だ。
特にファイルシステムオブジェクト(FSO)を用いたパス操作は、自動化の初歩にして、ここを疎かにすると「動くがメンテナンス不可能なスパゲッティコード」の温床となる。今回は、単なるメソッドの解説に留まらず、プロダクション環境で耐えうる「堅牢なファイル分類スクリプト」の設計思想を伝授する。
—
1. なぜ「手動のパス解析」をしてはいけないのか
初心者がやりがちなミスは、`InStrRev`や`Mid`を駆使してパス文字列を自力で分割することだ。
- 脆弱性: OSの仕様変更や特殊なファイル名(ドットが複数含まれる等)に対応できない。
- 可読性: ロジックが複雑化し、数ヶ月後の自分が内容を理解できなくなる。
我々プロフェッショナルは、`FileSystemObject`の提供する抽象化レイヤーを最大限に利用する。 `GetExtensionName`と`GetBaseName`は、OSが定義するパスのルールを内包しており、これを使うことが「バグのない自動化」への最短距離だ。
—
2. 実装の要諦:プロダクションコード
以下のコードは、単にファイルを移動させるだけではない。「フォルダが存在しなければ作成し、例外をハンドリングする」という、実務で必須の防御的プログラミングを施している。
Option Explicit
‘ ———————————————————
‘ ファイル自動分類スクリプト:Downloadsフォルダの整理
‘ ———————————————————
Dim fso, targetFolder, file, folderPath, ext, baseName, destFolder
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 分類対象のディレクトリ(環境に合わせて変更)
targetFolder = “C:\Users\YourName\Downloads”
If Not fso.FolderExists(targetFolder) Then
WScript.Echo “エラー: 対象フォルダが見つかりません。”
WScript.Quit
End If
‘ フォルダ内の全ファイルを走査
For Each file In fso.GetFolder(targetFolder).Files
‘ パスから情報を抽出(FSOの基本メソッド)
ext = LCase(fso.GetExtensionName(file.Path))
‘ 拡張子がないファイルは「Others」へ
If ext = “” Then ext = “others”
‘ 分類先パスの構築
destFolder = targetFolder & “\” & ext
‘ 分類先フォルダが存在しなければ作成
If Not fso.FolderExists(destFolder) Then
fso.CreateFolder(destFolder)
End If
‘ 移動処理(同名ファイルによるエラーを考慮し、本来はMoveFileの前にExists確認を推奨)
On Error Resume Next
fso.MoveFile file.Path, destFolder & “\” & file.Name
If Err.Number <> 0 Then
WScript.Echo “移動失敗: ” & file.Name & ” (使用中の可能性があります)”
Err.Clear
End If
On Error GoTo 0
Next
WScript.Echo “整理が完了しました。”
Set fso = Nothing
—
3. 現場で生き残るための「3つの規律」
このコードをベースに、さらに大規模な運用を行う場合は以下の点を意識してほしい。
① 「存在確認」と「例外処理」の徹底
`MoveFile`メソッドは、既に同名のファイルが移動先に存在する場合、容赦なくエラーを吐く。`On Error Resume Next`で処理を止めないことは重要だが、エラーが発生したファイルがどれか、ログファイルやコンソールに出力する仕組みを必ず組み込むこと。
② 拡張子の正規化
ユーザーが手動でリネームした「.JPG」と「.jpg」を同一視させるために、`LCase()`関数で必ず小文字に統一してから判定する。この一手間が、分類の重複や漏れを防ぐ鍵となる。
③ データベース/ログとの連携
もし分類したファイルの履歴を管理したいのであれば、`Scripting.TextStream`を使用してCSVログを生成することをお勧めする。
- `fso.OpenTextFile(path, 8, True)` を使用して追記モードでログを開く。
- 「タイムスタンプ, 元のパス, 移動先」を記録することで、後からのトレースが容易になる。
—
結論:コードは「資産」である
VBScriptは、シンプルであるがゆえに書き手の技量が露骨に出る言語だ。「動けばいい」という考えで書かれたスクリプトは、組織の技術的負債となる。
今回紹介したFSOのメソッドは、OSのファイル操作を抽象化し、あなたのコードを「環境の変化に強いもの」へと変えてくれるはずだ。ぜひ、このテンプレートをベースに、自分の業務に最適化された「自分専用の自動化エンジン」を構築してほしい。
技術とは、道具を使えるようになることではなく、道具を使って未来の自分を楽にすることである。健闘を祈る。
