【実務・中級編】【容量監視】Drivesコレクションを活用した空き容量(FreeSpace)チェックと閾値超過アラート通知 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【容量監視】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` コレクションの適切な走査と例外防御の思想を取り入れれば、保守性が高く、障害に強い監視基盤をわずか数分で構築できる。
あなたの管理するサーバー群から、容量枯渇による突然のシステムダウンを今すぐ排除してほしい。

タイトルとURLをコピーしました