【入門編】【ディスク容量安全確認】Drive オブジェクトを活用した空き容量事前チェックと書き込み失敗防止処理 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!業務自動化の現場を駆け抜けてきた先輩エンジニアです。

日々のバックアップ作業や、巨大なログファイル・CSVデータの出力処理をVBScriptに任せているそこのあなた。
「処理の途中でディスクの空き容量がなくなってエラーになり、中途半端なファイルが残って泣いた」……そんな苦い経験はありませんか?

プログラムがいざ実行されてから数時間後に「ディスクがいっぱいです」で強制終了される絶望感。あれ、本当に避けたいですよね。

今回は、プログラミング初学者や「マクロの記録」から一歩抜け出して本当の自動化エンジニアを目指すあなたへ向けて、`Drive`オブジェクトを使った空き容量の事前チェックと、書き込み失敗を未然に防ぐ安全停止のテクニックを伝授します。

ここをクリアすれば、あなたの書くスクリプトの「信頼性」はプロのレベルにグッと近づきますよ!

なぜ「書き込み前の事前チェック」がプロの必須スキルなのか?

VBScript(そしてそれを動かすWSH:Windows Script Host)は、WindowsのOS内部に深くアクセスできる非常にパワフルなツールです。ファイル操作も得意ですが、「失敗した後の後始末」よりも「失敗させないための予防」がエンジニアの腕の見せ所です。

処理の途中でディスク容量が枯渇すると、以下のような恐ろしい事態が起こります。

  • 書きかけの巨大ファイルが壊れた状態でディスクに残る。
  • 次回の処理が「ファイルが使用中」などの別エラーを引き起こす。
  • 最悪の場合、OSやアプリケーション全体の動作が不安定になる。

だからこそ、「処理を始める前に、十分な空き容量があるか厳しくジャッジする」という門番(バリデーション)をスクリプトの先頭に置く必要があるのです。

鍵を握るオブジェクト:`FileSystemObject` と `Drive`

VBScriptでドライブの情報を扱うときは、おなじみの `Scripting.FileSystemObject`(FSO)を使います。

このFSOから生み出される `Drive` オブジェクト には、ドライブの容量や空き容量を調べるための強力なプロパティが備わっています。

主なチェック用プロパティ

  • `AvailableSpace`(または `FreeSpace`):そのドライブで実際に利用可能な空き容量(バイト単位)を取得します。

> 💡 先輩からの知恵袋:`AvailableSpace` と `FreeSpace` の違い
> 実用上はほぼ同じですが、クォータ制限(ユーザーごとの容量制限)がかかっている環境では、実際に自分が書き込める上限を示す `AvailableSpace` を使うのがプロの選択です。

実践!空き容量チェック&安全停止スクリプト

それでは、現場でそのままコピペして使える実用的なコードをお見せします。
今回は「Cドライブに 500MB 以上の空きがあるか」をチェックし、足りなければ安全に停止してメッセージを出すサンプルです。

‘ =================================================================0
‘ 処理名: ディスク容量事前チェックによる安全停止サンプル
‘ 概要 : 指定ドライブの空き容量を計算し、必要容量を満たしているか判定する
‘ =================================================================0
Option Explicit

Dim fso, targetDrive, driveLetter
Dim requiredSizeMB, requiredSizeByte, availableSpaceByte
Dim msg

‘ — 1. 設定エリア —
driveLetter = “C” ‘ チェック対象のドライブ文字
requiredSizeMB = 500 ‘ 必要な空き容量 (MB)
requiredSizeByte = CDbl(requiredSizeMB) 1024 1024 ‘ バイトに変換

‘ — 2. FileSystemObjectの生成 —
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ — 3. ドライブオブジェクトの取得 —
‘ 指定されたドライブが存在するか、アクセス可能かチェック
If Not fso.DriveExists(driveLetter) Then
MsgBox “エラー: ドライブ [” & driveLetter & “:] が見つかりません。”, vbCritical, “ハードウェアエラー”
WScript.Quit
End If

Set targetDrive = fso.GetDrive(driveLetter)

‘ — 4. 空き容量の評価(ここが本丸!) —
availableSpaceByte = targetDrive.AvailableSpace

‘ デバッグ用(必要に応じてコメント解除してください)
‘ WScript.Echo “空き容量: ” & FormatNumber(availableSpaceByte / 1024 / 1024, 2) & ” MB”

If availableSpaceByte < requiredSizeByte Then ' 【容量不足】安全に処理を停止し、管理者へ警告 msg = "【警告】ディスク容量不足のため、処理を中断します。" & vbCrLf & _ "対象ドライブ: " & driveLetter & ":" & vbCrLf & _ "必要な空き容量: " & requiredSizeMB & " MB" & vbCrLf & _ "現在の空き容量: " & FormatNumber(availableSpaceByte / 1024 / 1024, 2) & " MB" MsgBox msg, vbExclamation, "容量不足による安全停止" ' オブジェクトの解放 Set targetDrive = Nothing Set fso = Nothing ' スクリプトを安全に終了 WScript.Quit End If ' --- 5. 容量クリア!メイン処理へ進む --- MsgBox "容量チェックOK!バックアップ処理を開始します。", vbInformation, "準備完了" ' ----------------------------------------------------------------- ' [ここに本来の重いファイル書き込み処理やバックアップ処理を書く] ' ----------------------------------------------------------------- ' 後始末 Set targetDrive = Nothing Set fso = Nothing ---

コードのポイントと初学者が陥りやすい罠

上記のコードには、現場で生き残るためのテクニックがいくつか詰め込まれています。特に注意してほしいポイントを解説します。

1. 巨大な数値を扱うときの `CDbl`(型変換)

VBScriptは変数の型をよしなに判断してくれる(バリアント型)便利な言語ですが、時々これが牙を向きます。
ギガバイト単位の計算や、MBをバイトに直す掛け算 (`500 1024 1024`) を行う際、整数のままだと 「オーバーフロー(Overflow)」エラー が発生することがあります。
これを防ぐために `CDbl()` を使って「倍精度浮動小数点数(Double)」に変換し、大きな数値を安全に扱えるようにしているのです。

2. `WScript.Quit` で潔く終わらせる

条件を満たさないことが分かった時点で、それ以降の無駄な処理を実行させずに `WScript.Quit` でスクリプトを即座に終了させます。
エラーを検知しているのに処理を続行してしまう「ゾンビプログラム」を作らないことが、安定稼働の基本です。

3. オブジェクトの解放(メモリ管理)

スクリプトの最後で `Set fso = Nothing` や `Set targetDrive = Nothing` を行っています。
VBScriptは終了時に自動でメモリを解放してくれますが、長時間の常駐プロセスや、他のCOMコンポーネントと連携する複雑なスクリプトを書く癖をつけるためにも、使ったオブジェクトは使い終わったら明示的に解放する(= `Nothing` を代入する)美学を今のうちに身につけておきましょう。

まとめ:堅牢な自動化の世界へようこそ

今回は `Drive` オブジェクトを活用した空き容量の事前チェックについて解説しました。

ただ動くだけのコードは誰でも書けます。しかし、「異常系(リソース不足など)を事前に察知し、システムやデータを守るコード」を書けるようになった瞬間から、あなたは立派な「業務自動化エンジニア」です。

ここをクリアすれば、VBScriptの基礎はもうバッチリですよ!
ぜひ、あなたの現場のバックアップスクリプトやファイル出力スクリプトにこの安全装置を組み込んでみてください。明日からの社内評価が変わること間違いなしです。それではまた!