VBScriptを極める:FSOとWMIの「いいとこ取り」でファイル管理を完全制覇する
こんにちは。現場で「動けばいい」コードから「壊れない、賢い」コードへと脱却したいあなたへ。
VBScriptは古い言語だと言われがちですが、Windows管理の現場では今なお最強の武器です。しかし、標準の`FileSystemObject (FSO)`だけで全ての要件を満たそうとするのは、実は遠回り。
今日は、「FSO」の軽快さと「WMI」の深淵な情報抽出能力をハイブリッドに活用する、プロフェッショナルなファイル管理術を伝授します。
—
1. なぜ「FSO」だけでは足りないのか?
多くの入門書は`Scripting.FileSystemObject`(以下FSO)を推奨します。確かにファイルやフォルダの操作(作成・移動・削除)において、FSOは直感的で最速です。
しかし、以下の要件にぶつかると、FSOは途端に無力になります。
- 所有者情報の取得: 「このファイル、誰が作ったの?」を調べるには、FSOにはプロパティがありません。
- 高度な検索: ワイルドカードで複雑な条件(例:特定の所有者が作成した、特定のサイズ以上のファイルなど)を絞り込むとき、FSOだと全ファイルをループで回す必要があり、パフォーマンスが劇的に低下します。
ここで登場するのがWMI (Windows Management Instrumentation) です。
—
2. WMIという「奥の手」とFSOの「実務能力」
WMIはWindowsの心臓部に直接クエリを投げる仕組みです。`Win32_Directory`や`CIM_DataFile`を使えば、OSレベルで管理されているメタデータを一瞬で引き出せます。
役割分担の黄金比
- WMIの役割: 検索条件の定義、所有者情報の取得、複雑な絞り込み。
- FSOの役割: ファイルの内容の読み書き、移動、リネーム、パスの正規化。
—
3. 実践:WMIで検索し、FSOで操作するコード
例えば、「Cドライブ直下の特定のフォルダから、所有者が特定ユーザーのファイルを探し出し、リスト化する」という処理を考えてみましょう。
‘ WMIとFSOを組み合わせたハイブリッドファイル検索
Option Explicit
Dim objWMIService, colFiles, objFile
Dim fso, logFile
Dim strComputer, strQuery, targetFolder
strComputer = “.”
‘ 検索対象パスはWMIの仕様上、円記号をエスケープする必要がある (\\)
targetFolder = “C:\\TargetData”
‘ WMIサービスへの接続
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)
‘ Win32_LogicalFileSecuritySettingを使うと所有者情報が取れるが、
‘ 今回はシンプルにCIM_DataFileでパス絞り込みと所有者確認を行う
strQuery = “SELECT FROM CIM_DataFile WHERE Drive = ‘C:’ AND Path = ‘\\TargetData\\'”
Set colFiles = objWMIService.ExecQuery(strQuery)
‘ FSOの準備(ログ出力用)
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set logFile = fso.CreateTextFile(“C:\Temp\FileList.txt”, True)
For Each objFile In colFiles
‘ ここでWMIの強力なプロパティを活用
‘ GetSecurityDescriptorメソッドで所有者を特定可能
logFile.WriteLine “ファイル名: ” & objFile.FileName
logFile.WriteLine “作成者: ” & GetOwner(objFile.Name) ‘ 別途関数で所有者取得
logFile.WriteLine “————————–”
Next
logFile.Close
WScript.Echo “集計完了。”
‘ 所有者を取得するための関数(WMIの特権操作)
Function GetOwner(filePath)
Dim objFileSec, objSD, objOwner
Set objFileSec = GetObject(“winmgmts:\\.\root\cimv2:Win32_LogicalFileSecuritySetting.Path='” & filePath & “‘”)
If objFileSec.GetSecurityDescriptor(objSD) = 0 Then
GetOwner = objSD.Owner.Name
Else
GetOwner = “不明”
End If
End Function
—
4. 陥りやすい罠とプロの回避策
この手法を使う際、初心者の方が必ず躓くポイントが2つあります。
① パスのエスケープ問題
WMIへのクエリはSQLに近い形式です。パス内の `\` は `\\` と書かないと、WMIは正しく解釈できません。
- 対策: `Replace(path, “\”, “\\”)` を挟む関数を用意するのが定石です。
② 権限(パーミッション)エラー
WMIで所有者情報を取得しようとすると、システムファイルやアクセス権のないフォルダに触れた瞬間にスクリプトが停止します。
- 対策: `On Error Resume Next` を活用し、エラーが発生した場合は `Err.Clear` でスキップする「静かなエラーハンドリング」を必ず実装してください。
—
5. まとめ:今日からできるステップアップ
1. まずはFSOで骨組みを作る: フォルダ走査の基本はFSOで。
2. 情報が足りなければWMIを呼び出す: 所有者や作成日時、アクセス権などの詳細なメタデータが必要ならWMIへ。
3. 役割を分ける: 「処理」はFSO、「抽出」はWMI。この切り分けができるだけで、あなたのスクリプトは劇的に安定します。
VBScriptは、OSの深部と対話できる非常に強力なツールです。マクロの記録から脱却し、WMIという「OSの管理者権限」を手なずける感覚をぜひ味わってください。
ここをクリアすれば、あなたはもう立派な自動化アーキテクトの入り口に立っていますよ。また次のステップで会いましょう!
