こんにちは!現場でバリバリ自動化を進めている先輩エンジニアです。
マクロの記録ボタンを押すだけの世界から一歩抜け出し、「自分の手でシステムを裏から操りたい!」と思っているあなたへ。今回は、Windows環境のインフラ管理やバッチ処理で避けて通れない「ディスク容量の監視とアラート通知」をテーマに、VBScriptの真髄を伝授します。
ここをクリアすれば、OSの奥底にあるハードウェア情報にアクセスし、自動で判断を下すスクリプトの仕組みが手に取るように分かりますよ。気負わず、一緒に紐解いていきましょう!
—
なぜVBScriptで「容量監視」なのか?
「今どきPowerShellやPythonがあるのに、なぜVBScript?」と思うかもしれません。
しかし、考えてみてください。Active Directoryのポリシーで最新の言語ランタイムが入っていない古いサーバーや、追加のインストーラーが一切許されない超セキュアな閉域網の現場……そんな「絶望的な環境」でも、VBScriptならWindows 98の時代から標準搭載されているため、メモ帳さえあれば一瞬で動き出すのです。
この「どこでも動く機動力」こそが、インフラエンジニアがいまだにVBScriptを愛用する理由です。
そして、その心臓部となるのが FSO(FileSystemObject)。今回はその中でも、PCに刺さっているすべてのハードディスクを束ねる `Drives` コレクションを華麗に使いこなしてみましょう。
—
全体像:ドライブ巡回スクリプトのアーキテクチャ
まずは、今回作成するスクリプトがどのような流れで動くのか、頭の中にイメージ図を作ります。
[ スクリプト起動 ]
↓
[ FSO (FileSystemObject) の召喚 ]
↓
[ Drives コレクションから全ドライブを取得 ]
↓
┌─(ループ処理)────────────────────────┐
│ 各ドライブに対して: │
│ 1. ドライブが存在するか? (IsReady)│
│ 2. 固定ドライブ(Type=2)か? │
│ 3. 空き容量の割合を計算 │
│ 4. 閾値(例: 10%)未満か判定 │
└─────────────────────────────────────┘
↓
[ 閾値オーバーがあればアラート(ログ出力等) ]
シンプルですが、現場でそのまま使える堅牢なロジックを組み込みます。
—
実装コード:現場で即戦力となる容量監視スクリプト
以下のコードをコピーして、テキストエディタ(メモ帳など)に貼り付け、拡張子を `.vbs` (例: `drive_checker.vbs`)として保存してください。
‘ ==============================================================================
‘ ファイル名: drive_checker.vbs
‘ 概要 : 全固定ドライブの空き容量を監視し、閾値(10%)を下回ったら警告を出す
‘ 著者 : チーフアーキテクト先輩
‘ ==============================================================================
Option Explicit
‘ 定数の定義
Const THRESHOLD_PERCENT = 10 ‘ 警告を発する空き容量の閾値(%)
Const LOG_FILE_PATH = “C:\Temp\DriveAlert.log”
Dim fso, drives, drv
Dim totalGB, freeGB, freePercent
Dim alertCount
‘ 1. FileSystemObjectのインスタンス化(FSOの召喚)
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set drives = fso.Drives
alertCount = 0
‘ ログファイルの初期化(実行時のタイムスタンプを記録)
Call WriteLog(“=== ディスク容量監視スクリプト 開始 ===”)
‘ 2. Drivesコレクションの巡回(ループ処理)
For Each drv In drives
‘ 【重要】USBメモリやDVDドライブなどは「準備完了(IsReady)」ではないため除外
If drv.IsReady Then
‘ 【重要】Type = 2 は「固定ディスク(Local Disk)」を指す(ネットワークやリムーバブルを除外)
If drv.DriveType = 2 Then
‘ バイト単位の値をGB(ギガバイト)に変換計算
‘ 1 GB = 1,024 1,024 1,024 バイト
totalGB = Round(drv.TotalSize / (1024 1024 1024), 2)
freeGB = Round(drv.FreeSpace / (1024 1024 1024), 2)
‘ 空き容量の割合を計算
freePercent = Round((drv.FreeSpace / drv.TotalSize) 100, 1)
‘ コンソール出力(WScript.Echoの代わりにログやデバッグ用)
‘ WScript.Echo “Drive ” & drv.DriveLetter & “: ” & freePercent & “% free”
‘ 3. 閾値判定
If freePercent < THRESHOLD_PERCENT Then
Dim msg
msg = "【警告】ドライブ " & drv.DriveLetter & ": (空き: " & freePercent & "% / 全体: " & totalGB & "GB)"
Call WriteLog(msg)
alertCount = alertCount + 1
End If
End If
End If
Next
Call WriteLog("=== 監視終了 (警告検知数: " & alertCount & "件) ===")
' 4. 結果に応じたユーザー通知
If alertCount > 0 Then
MsgBox “ディスクの空き容量が不足しているドライブがあります!” & vbCrLf & _
“詳細はログファイルを確認してください: ” & LOG_FILE_PATH, vbCritical, “容量アラート”
Else
‘ 通常運用時はメッセージを出さない方が好ましいが、手動実行テスト用に記載
‘ MsgBox “すべての固定ドライブは正常です。”, vbInformation, “容量チェック”
End If
‘ オブジェクトの解放(メモリのクリーンアップ)
Set drives = Nothing
Set fso = Nothing
‘ ==============================================================================
‘ サブルーチン: ログ出力関数
‘ ==============================================================================
Sub WriteLog(message)
Dim shell, logFolder
Set shell = CreateObject(“WScript.Shell”)
‘ ログ保存先フォルダが存在しない場合は自動作成する堅牢な設計
logFolder = fso.GetParentFolderName(LOG_FILE_PATH)
If Not fso.FolderExists(logFolder) Then
fso.CreateFolder(logFolder)
End If
‘ テキストファイルを追記モード(ForAppending = 8)で開く
Dim ts
Set ts = fso.OpenTextFile(LOG_FILE_PATH, 8, True)
ts.WriteLine “[” & Now & “] ” & message
ts.Close
Set ts = Nothing
Set shell = Nothing
End Sub
—
コードの深掘り:ここがVBScriptのキモだ!
プログラミング初学者がハマりやすいポイントや、プロフェッショナルが必ず押さえるコードの急所を解説します。
1. `Option Explicit` はエンジニアの良心
コードの最上部に書いた `Option Explicit`。これ、何の意味があるか知っていますか?
これを書くと、「変数の宣言(Dim)を強制する」ことができます。もしこれを忘れて `freePercent` を `freepct` とうっかりタイポした場合、VBScriptは勝手に新しい空っぽの変数を作ってしまい、原因不明のバグに悩まされることになります。バグを未然に防ぐ防壁として、必ずおまじないのように書いてください。
2. `IsReady` と `DriveType` の魔力
`For Each drv In drives` でPC内の全ドライブを舐めるとき、USBメモリが挿さっていたり、CDドライブが空だったりすると、プログラムは容赦なくエラー(「ディスクがありません」)を吐いてクラッシュします。
それを防ぐのが `If drv.IsReady Then` です。「今、アクセス可能な状態か?」を事前に確認する、大人の優しさですね。
さらに、`drv.DriveType = 2` は 「固定ハードディスク(ローカルドライブ)」 だけに絞り込むフィルターです。ネットワークドライブ(Type 3)やリムーバブルメディア(Type 1)を含めると、社内サーバーの応答遅延でスクリプト全体がフリーズする原因になります。ここを絞るのがプロの技です。
3. オブジェクトのライフサイクルと解放
コードの最後にある `Set drives = Nothing` や `Set fso = Nothing`。
「スクリプトが終るんだから、勝手にメモリから消えてくれるでしょ?」と思っていませんか?
VBScriptの裏で動くCOMオブジェクト(FSOなど)は、メモリやファイルロックをガッチリ掴んだまま残ることがあります。特に長時間のバッチ処理や、サーバー常駐型のスクリプトでは、使い終わったオブジェクトは明示的に `Nothing` を代入して解放するのが、メモリリークを防ぐための鉄則です。
—
陥りがちなエラーと対処法
1. エラー: 「パスが見つかりません」 (エラー 76)
- 原因: ログ出力先として指定したフォルダ(例: `C:\Temp\`)が、そもそも存在しない場合に発生します。
- 対策: 今回のサンプルコードでは、サブルーチン内に `FolderExists` と `CreateFolder` による自動生成ロジックを組み込んでいるためこのエラーは回避されます。自分でフォルダ操作を行うときは、常に親フォルダの存在確認をセットで行いましょう。
2. エラー: 「型が一致しません」 (エラー 13)
- 原因: バイト数(`TotalSize` など)は非常に大きな数値(Long Long型に近い扱いにくいサイズ)になるため、単純に計算させるとオーバーフロー気味になることがあります。
- 対策: `Round()` 関数で適宜丸め処理を行い、適切な小数点でデータ型をコントロールするのが安全です。
—
おわりに:ここをクリアすれば、もう初心者ではない!
お疲れ様でした!ここまで読み進め、コードの意味を理解できたあなたは、もはや単なる「マクロの記録者」ではありません。OSの構造を理解し、システムを意のままに自動化する「業務自動化エンジニア」の仲間入りです。
このスクリプトをWindowsの「タスクスケジューラ」に登録し、毎日朝9時に自動実行するように仕込んでみてください。あなたのインフラ管理スキルは、確実に次のステージへと進化していますよ。
それでは、また次の自動化の現場でお会いしましょう!
