【容量監視】Drivesコレクションを活用した空き容量チェックと閾値超過アラート通知
開発現場でシステムを常時稼働させていると、最も頭を悩ませるインシデントの一つが「ディスク容量の枯渇」だ。ログファイルの肥大化、データベースの自動拡張、一時ファイルの残骸――気づいた時にはドライブが100%になり、サービスが沈黙する。
「定期的にサーバーのディスク容量をチェックしろ」とは言うものの、人間の手でリモートデスクトップに接続し、1台ずつエクスプローラーを開いて確認するなどというのは、エンジニアのすることではない。24時間365日、システムが自動で監視し、閾値を超えた瞬間に検知・通知する仕組みが不可欠だ。
今回は、VBScriptの`FileSystemObject`が持つ`Drives`コレクションを極限まで活用し、全ドライブの空き容量を動的に監視・判定、閾値超過時にアラートを生成するプロダクションクオリティのスクリプトを解説する。
—
なぜ「文字列のハードコーディング」は悪なのか?
初学者が書きがちなアンチパターンとして、以下のようなコードがある。
‘ 【悪手】固定ドライブのハードコーディング
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set drv = fso.GetDrive(“C:”)
If drv.FreeSpace / drv.TotalSize < 0.1 Then
' アラート処理
End If
このアプローチには実務上、致命的な欠陥が2つある。
1. 環境依存性: サーバーによって追加ドライブ(`D:`や`E:`)の構成が異なるため、スクリプトを環境ごとに書き換える必要がある。
2. ランタイムエラーの温床: 存在しないドライブや、ネットワークドライブ、メディアが入っていない光学ドライブなどを指定した瞬間、スクリプトは容赦なくクラッシュする。
プロのアーキテクトであれば、「静的に決め打ちせず、動的に列挙し、かつ例外をハンドリングする」設計にしなければならない。それを最もエレガントに実現するのが、`FileSystemObject.Drives` コレクションである。
—
堅牢なディスク監視エンジンの設計思想
今回のスクリプトで担保すべき要件は以下の通りだ。
1. 全ドライブの自動列挙: マウントされているすべてのローカル・ネットワークドライブを動的に取得する。
2. 接続状態(IsReady)の判定: 外付けHDDや切断されたネットワークドライブなど、「現在アクセス不能なドライブ」を無視してクラッシュを防ぐ。
3. 固定ドライブ(Fixed)のフィルタリング: 一時的なCD-ROMやリムーバブルメディアを除外し、監視対象を明確にする。
4. 割合(パーセンテージ)による閾値判定: 単なる「残り○GB」ではなく、ドライブ全体のサイズに対する「空き容量の割合(例: 10%未満)」で判定する。
5. ログ出力によるトレーサビリティ: 実行結果をログファイルに記録し、後から監査できるようにする。
—
プロダクションコード:容量監視・アラートスクリプト
以下のコードは、そのまま実務のタスクスケジューラに組み込んで即座に運用できる完成版のVBScriptである。文字コードは UTF-8(BOM付き) または Shift-JIS で保存して実行してほしい。
‘ ==============================================================================
‘ Script Name : DriveSpaceMonitor.vbs
‘ Description : Drivesコレクションを用いたディスク空き容量監視スクリプト
‘ Author :Chief System Architect
‘ ==============================================================================
Option Explicit
‘ — 定数定義 —
Const THRESHOLD_PERCENT = 10 ‘ 警告閾値(残容量が全体の一何%を下回ったらアラートとするか)
Const LOG_FILE_NAME = “DriveAlert.log”
Dim fso, drivesList, drv, logPath, stream
Dim totalGB, freeGB, freePercent, alertCount
‘ 1. FileSystemObjectの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 2. ログファイルのパスをスクリプト実行場所と同階層に設定
logPath = fso.BuildPath(fso.GetParentFolderName(WScript.ScriptFullName), LOG_FILE_NAME)
‘ 3. ログストリームのオープン(ForAppending: 追記モード, True: 自動作成)
On Error Resume Next
Set stream = fso.OpenTextFile(logPath, 8, True)
If Err.Number <> 0 Then
WScript.Echo “致命的エラー: ログファイルを開けませんでした。” & Err.Description
WScript.Quit 1
End If
On Error GoTo 0
‘ 監視開始ログの記録
stream.WriteLine “————————————————–”
stream.WriteLine “監視実行日時: ” & Now()
stream.WriteLine “判定閾値 : 残容量 ” & THRESHOLD_PERCENT & “% 未満”
alertCount = 0
‘ 4. Drivesコレクションによる全ドライブの走査
Set drivesList = fso.Drives
For Each drv In drivesList
‘ 【重要】IsReadyプロパティのチェック
‘ ドライブが準備完了状態(DVDドライブにディスクがない、ネットワークが切断されている等を除外)
If drv.IsReady Then
‘ DriveType = 2 は固定ディスク (Fixed) を意味する
‘ ※必要に応じてネットワークドライブ(3)等も対象に含める場合は条件を調整すること
If drv.DriveType = 2 Then
‘ バイト単位からギガバイト単位へ変換 (1GB = 102410241024 bytes)
totalGB = Round(drv.TotalSize / (1024 1024 1024), 2)
freeGB = Round(drv.FreeSpace / (1024 1024 1024), 2)
‘ ゼロ除算防止
If drv.TotalSize > 0 Then
freePercent = Round((drv.FreeSpace / drv.TotalSize) 100, 1)
Else
freePercent = 0
End If
‘ 5. 閾値判定
If freePercent < THRESHOLD_PERCENT Then
alertCount = alertCount + 1
stream.WriteLine "[警告] ドライブ " & drv.DriveLetter & ": \
残容量が危険水域です! (全体: " & totalGB & "GB / 空き: " & freeGB & "GB [" & freePercent & "%])"
Else
stream.WriteLine "[正常] ドライブ " & drv.DriveLetter & ": \
(全体: " & totalGB & "GB / 空き: " & freeGB & "GB [" & freePercent & "%])"
End If
End If
End If
Next
' 6. 最終結果のサマリー記録
If alertCount > 0 {
stream.WriteLine “[判定] 警告対象のドライブが ” & alertCount & ” 件検出されました。”
‘ TODO: ここにメール送信ロジック(CDO.Message等)を組み込むことで管理者への通知が可能
} Else {
stream.WriteLine “[判定] すべてのドライブは正常です。”
End If
stream.WriteLine “————————————————–”
stream.Close
‘ オブジェクトの解放
Set stream = Nothing
Set drivesList = Nothing
Set fso = Nothing
WScript.Quit 0
—
現場のエンジニアへ:実装上の重要ポイント
このコードをデプロイするにあたり、アーキテクトとして押さえておくべき「深部の知見」を共有する。
1. `drv.IsReady` の絶対性
ネットワークドライブやリムーバブルメディア(USBメモリ等)は、物理的な接続状況やアクセスの可否によって、プロパティにアクセスした瞬間にスクリプトが停止(I/Oエラー)する。`If drv.IsReady Then` というガード句を挟まないコードは、実務において「いつか必ず爆発する爆弾」を仕込んでいるのと同義である。
2. DriveType の魔力
`DriveType` プロパティは以下の数値を返す。
- `0`: 不明 (Unknown)
- `1`: リムーバブル (Removable)
- `2`: 固定ディスク (Fixed) ※通常のローカルHDD/SSD
- `3`: ネットワーク (Network)
- `4`: CD-ROM
- `5`: RAMディスク
今回はサーバー監視を想定しているため `DriveType = 2`(固定ディスク)に絞っているが、ファイルサーバーなどでネットワークドライブ(`3`)も監視対象に含めたい場合は、`If drv.DriveType = 2 Or drv.DriveType = 3 Then` のように拡張してほしい。
3. さらなる自動化(メール通知連携への布石)
上記のスクリプトはログファイル(`DriveAlert.log`)に出力して完結しているが、実運用では「閾値超過時に管理者へメールを飛ばしたい」という要件が必ず出てくる。
その場合は、`alertCount > 0` のブロックに `CDO.Message` オブジェクトを用いたメール送信処理を追記すればよい。VBScript単体で外部ライブラリに依存せずSMTPメールを送信できるため、インフラ管理スクリプトとの相性は抜群に良い。
—
まとめ
VBScriptはレガシーな言語と評されがちだが、Windows環境における「ちょっとしたインフラ自動化・システム監視」において、これほど手軽で、追加のランタイムインストールを必要としない強固なツールはほかに存在しない。
今回解説した `Drives` コレクションの適切な走査と例外防御の思想を取り入れれば、保守性が高く、障害に強い監視基盤をわずか数分で構築できる。
あなたの管理するサーバー群から、容量枯渇による突然のシステムダウンを今すぐ排除してほしい。
