【入門編】【実務中級者向け】FSOとWScript.ShellのPopupメソッドを連携させた「ディスク残容量危険域到達」時のデスクトップ警告通知スクリプト – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク
スポンサーリンク

マクロの記録から「自動化の設計」へ。FSOとPopupで構築する、サーバーを守る「警告の仕組み」

こんにちは。現場の自動化設計を統括しているエンジニアです。

皆さんは、Excelマクロの「操作の記録」から一歩踏み出し、「自分でスクリプトを書いて、PCやサーバーの動きを制御したい」と思うようになったのではないでしょうか?

「記録」は便利な道具ですが、それはあくまで「決まった手順の再生」に過ぎません。真の自動化エンジニアとは、「もし〜だったら、〜する」という条件(ロジック)を組み込み、システムに「判断」をさせる者を指します。

今日は、その第一歩として、非常に実用的かつ「オブジェクトの扱い」の本質を学べるテーマを用意しました。

「ディスクの空き容量が減ってきたら、デスクトップに警告を出す」

このシンプルな仕組みを通じて、VBScriptの強力な武器である`FileSystemObject (FSO)`と、ユーザーに介入するための`WScript.Shell`を完全に掌握していきましょう。

1. 今回の設計思想:監視者と伝令官

今回のプログラムには、2つの重要な「役割」を持ったオブジェクトが登場します。

オブジェクト 役割 例え話
FileSystemObject (FSO) ファイルシステム(ドライブやファイル)の状態を読み取る 「監視者」:現場の状況を正確に把握する目
WScript.Shell Windowsのシェル機能(通知、実行など)を操る 「伝令官」:異常を察知して人間に知らせる口

「監視者」がドライブの空き容量をチェックし、「伝令官」が閾値(しきいち)を超えたらポップアップを表示する。この連携こそが、実務における自動化ツールの基本構造です。

2. 実装コード:ディスク容量警告スクリプト

まずは、そのまま使えるコードを見てみましょう。これを`.vbs`という拡張子で保存すれば、ダブルクリックで動作します。

' ==========================================================================
' Script Name: DiskSpaceMonitor.vbs
' Description: ドライブの空き容量を監視し、閾値を下回ると警告を表示する
' Author: Senior Automation Architect
' ==========================================================================

Option Explicit ' 変数の宣言を強制する(バグを防ぐための鉄則!)

' --- 設定値エリア ---
Const TARGET_DRIVE = "C:"          ' 監視対象のドライブ
Const THRESHOLD_PCT = 10.0         ' 警告を出す空き容量の閾値 (%)
Const POPUP_TIMEOUT = 10           ' ポップアップを表示する秒数(0で閉じない)

' --- オブジェクトの宣言 ---
Dim objFSO, objDrive, objShell
Dim freeSpace, totalSize, freePct

' エラーハンドリング(予期せぬエラーで止まらないようにする)
On Error Resume Next

' 1. オブジェクトの生成(インスタンス化)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")

' 2. 対象ドライブの取得
Set objDrive = objFSO.GetDrive(TARGET_DRIVE)

' ドライブが存在するかチェック
If Err.Number <> 0 Then
    MsgBox "エラー: ドライブ " & TARGET_DRIVE & " が見つかりません。", vbCritical, "システムエラー"
    WScript.Quit
End If

' 3. 容量計算のロジック
' FreeSpace と TotalSize はバイト単位で返ってくるため、浮動小数点数として扱う
totalSize = objDrive.TotalSize
freeSpace = objDrive.FreeSpace

' 空き容量の割合を計算 ( (空き容量 / 全容量) * 100 )
freePct = (freeSpace / totalSize) * 100

' 4. 判定と通知
If freePct < THRESHOLD_PCT Then
    ' 警告メッセージの構築
    Dim msg
    msg = vbCrLf & "【警告】ディスク容量が不足しています!" & vbCrLf & _
          "現在の空き容量: " & Round(freePct, 2) & "%" & vbCrLf & _
          "対象ドライブ: " & TARGET_DRIVE
    
    ' WScript.ShellのPopupメソッドを使用
    ' 引数: メッセージ, 表示時間(秒), タイトル, アイコン/ボタンの種類
    objShell.Popup msg, POPUP_TIMEOUT, "ディスク容量警告", vbExclamation + vbSystemModal
Else
    ' 正常時はログ出力(実務ではファイルへの書き出しが推奨される)
    ' WScript.Echo "容量は正常です: " & Round(freePct, 2) & "%"
End If

' 5. 後始末(オブジェクトの解放)
' ライフサイクルを意識し、使い終わったオブジェクトは明示的に破棄する
Set objDrive = Nothing
Set objFSO = Nothing
Set objShell = Nothing

On Error GoTo 0 ' エラーハンドリングを元に戻す

3. プロの視点:コードの核心を解剖する

コードをただコピーするだけでは、あなたはまだ「マクロ記録者」のままです。エンジニアとして、以下の3つのポイントを深く理解してください。

① なぜ `Option Explicit` を書くのか?

コードの冒頭にあるこの一行。これは「宣言していない変数を使ったら即座にエラーにせよ」という命令です。
VBScriptは非常に寛容な言語で、タイポ(打ち間違い)があっても勝手に新しい変数として扱ってしまいます。`freeSpace`を`freeSpce`と書いても、エラーにならずに計算が狂い、原因不明のバグを生みます。これを防ぐのが、プロの第一歩です。

② `FSO.GetDrive` と数値の精度

`objDrive.FreeSpace`が返す値は、バイト単位の巨大な数値です。これをそのまま比較するのではなく、一度「割合(%)」に変換しています。
ここで重要なのは、VBScriptが内部的に数値を「Double型(倍精度浮動小数点数)」として扱う点です。これにより、小数点以下の細かい計算も可能になります。

③ `WScript.Shell.Popup` の魔法

`MsgBox`と`Popup`の違いを知っていますか?

  • MsgBox: ユーザーが「OK」を押すまで、プログラムの実行を完全に停止させます。
  • Popup: 指定した秒数(今回は10秒)が経過すると、自動的に閉じることができます。

定期タスク(タスクスケジューラ)で動かす場合、誰かがボタンを押さない限りスクリプトが残り続け、メモリを食いつぶす……なんて事態は避けなければなりません。`Popup`のタイマー機能は、自動化において極めて重要な要素です。

4. 陥りやすい罠(ハマりポイント)

実務でこのスクリプトを運用する際、初心者が必ずと言っていいほど遭遇する壁があります。

1. 「タスクスケジューラで動かしてもポップアップが出ない!」
これが最大の罠です。タスクスケジューラで「ユーザーがログオンしているかどうかにかかわらず実行する」設定にすると、スクリプトは「セッション0」という、画面を持たないバックグラウンド領域で実行されます。
画面(デスクトップ)に通知を出したいなら、必ず「ユーザーがログオンしているときのみ実行する」設定にしてください。

2. 権限の問題
ネットワークドライブ(`Z:`など)を監視しようとする場合、実行ユーザーの権限によってはドライブが見えないことがあります。監視対象がローカルかネットワークかによって、設計を変える必要があるのです。

結びに:次なるステップへ

お疲れ様でした。ここまで読み進めたあなたは、単なる「コードの書き手」ではなく、「システムの挙動を設計する思考」を手に入れつつあります。

今回のスクリプトは、まだ基礎の基礎です。

  • 「空き容量が減ったら、古いログファイルを自動削除する」
  • 「警告内容をテキストファイルにログとして残す」
  • 「メール送信機能を追加して、管理者に即座に飛ばす」

このように、一つのロジックに機能を肉付けしていくことで、あなたのツールは「ただのスクリプト」から「信頼できるシステム」へと進化していきます。

ここをクリアすれば、VBScriptの基本はバッチリですよ。自信を持って、次の自動化に挑戦してください!

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