PowerShellでディスクの空き容量を確認するなら、Windowsのボリューム情報を返すGet-Volumeが分かりやすい入口です。ただし、Cドライブの空き容量、ドライブ文字のないボリューム、物理ディスクの未割り当て領域、ネットワーク共有の空き、ユーザーのクォータは別の情報です。空き率だけでも空きGBだけでも、容量の大きさや増加速度を正しく判断できません。本記事ではGet-Volume、Win32_LogicalDisk、Get-PSDriveを読み取り専用で使い分け、しきい値、監視、誤判定、安全な次の対応まで解説します。
最初にボリューム、ドライブ、物理ディスクを区別する
利用者が「ディスク」と呼ぶCドライブは、通常はファイルシステムを持つボリュームへドライブ文字を割り当てたものです。一つの物理ディスクに複数ボリュームがある場合や、複数物理ディスクからStorage Spacesの仮想ディスクを構成する場合もあります。物理ディスク全体に空きがあっても、Cボリュームを自動拡張できるとは限りません。
確認目的が、アプリの書き込み先、OS更新に必要なCの空き、ログ用D、クラスタ共有ボリューム、ネットワーク共有、物理ディスク故障、未割り当て領域のどれかを決めます。本記事の中心はファイルシステムのボリューム空きです。物理ディスクの健康状態、パーティション配置、ストレージプールの容量はGet-Disk、Get-Partition、Get-StoragePoolなどで別に確認します。
Get-Volumeで容量と残り容量を一覧表示する
Get-Volumeは、条件を指定しなければボリュームオブジェクトを返します。DriveLetter、FileSystemLabel、FileSystem、HealthStatus、OperationalStatus、Size、SizeRemainingを選び、GiBへ換算した列と空き率を追加すると比較しやすくなります。Sizeが0または不明の項目では0除算を避け、空き率を未取得として扱います。
Get-Volume | ForEach-Object {
[pscustomobject]@{
Drive = $_.DriveLetter
Label = $_.FileSystemLabel
FileSystem = $_.FileSystem
Health = $_.HealthStatus
SizeGiB = if ($_.Size) { [math]::Round($_.Size / 1GB, 2) }
FreeGiB = if ($_.Size) { [math]::Round($_.SizeRemaining / 1GB, 2) }
FreePercent = if ($_.Size) { [math]::Round(100 * $_.SizeRemaining / $_.Size, 1) }
}
}
PowerShellの1GBは2の30乗バイトとして計算されるため、ストレージ製品の10進GB表示と数値が少し異なることがあります。報告ではGiB相当と書くか計算方法を示します。HealthStatusがHealthyでも、ファイルシステムの整合性、物理媒体の寿命、アプリ性能を完全に保証しません。容量と健康状態は別の観測として扱い、異常表示があればストレージ管理とイベントログを確認します。
特定のドライブ文字だけを確認する
CドライブだけならGet-Volume -DriveLetter Cで取得できます。スクリプトでは値が返らない場合を例外として扱い、0バイトの空きと混同しません。回復環境、WinPE、サーバー、マウント構成によってOSボリュームが必ずCとは限りません。Win32_OperatingSystemのSystemDriveや環境変数を確認し、目的のパスが実際にどのボリュームへ属するかを確認します。
$volume = Get-Volume -DriveLetter C -ErrorAction Stop
[pscustomobject]@{
Drive = "C:"
SizeGiB = [math]::Round($volume.Size / 1GB, 2)
FreeGiB = [math]::Round($volume.SizeRemaining / 1GB, 2)
FreePercent = [math]::Round(100 * $volume.SizeRemaining / $volume.Size, 1)
}
アプリがC:\Dataを使っているように見えても、そのフォルダーが別ボリュームのマウントポイントになっている場合があります。ドライブ文字だけの監視では見落とします。Get-Volume -FilePathを利用できる環境なら、Get-Volume -FilePath 'C:\Mounts\Data\sample.dat'のように実在するファイルの完全パスを指定し、所属するボリュームを確認できます。アクセス権不足、存在しないパス、ネットワークパスをローカル空き0として集計しません。
Win32_LogicalDiskでローカル固定ディスクを取得する
Get-CimInstance Win32_LogicalDiskはDeviceID、DriveType、VolumeName、FileSystem、Size、FreeSpaceなどを返します。DriveType = 3はローカル固定ディスクとして扱われる論理ディスクの絞り込みに使えます。CIMセッションで許可されたリモート端末を確認しやすく、古いWindows環境との互換性が必要な棚卸しでも利用されます。
Get-CimInstance Win32_LogicalDisk -Filter "DriveType = 3" |
Select-Object DeviceID, VolumeName, FileSystem, Size, FreeSpace
DriveTypeの分類と実際の物理構成は同じではありません。仮想ディスク、SAN、クラウドディスク、Storage Spacesでもローカル固定ディスクとして見えることがあります。SizeとFreeSpaceがNullの行は計算から除外し、取得失敗として記録します。リモート取得では端末停止、CIM構成、認証、権限、ファイアウォールの失敗を、容量0やドライブなしと分けます。
Get-PSDriveはPowerShellから見えるファイルシステムを確認する
Get-PSDrive -PSProvider FileSystemでは、PowerShellセッションから見えるファイルシステムドライブを取得できます。Name、Root、Used、Freeなどを確認し、ドライブ文字やセッション内で割り当てたドライブを素早く把握できます。ただし、PSDriveにはレジストリや証明書などファイルシステム以外のプロバイダーもあるため、PSProviderで限定します。
Get-PSDrive -PSProvider FileSystem |
Select-Object Name, Root, Used, Free, Description
ネットワークドライブは実行ユーザーとログオンセッションに依存し、管理者として開いたPowerShellやタスクからは利用者の割り当てが見えない場合があります。Freeが取得できない共有やプロバイダーもあります。Get-PSDriveの一覧を端末全体の永続マッピングと断定せず、SMB接続、エクスプローラーの利用者セッション、共有側のクォータや容量を管理者と確認します。資格情報をスクリプトへ埋め込みません。
ドライブ文字のないボリュームとマウントポイントを見落とさない
回復、EFI、システム予約などのボリュームはドライブ文字を持たないことがあります。アプリ用ボリュームをC:\Mounts\Dataのようなフォルダーパスへマウントする構成もあります。Get-VolumeのDriveLetterが空でも直ちに不要とは判断せず、Path、UniqueId、FileSystemLabel、パーティションとの関連を確認します。小さなシステムボリュームを通常データ用の空き率警告へ含めると誤報になります。
監視対象はボリュームの役割ごとに定義します。OS、アプリデータ、トランザクションログ、バックアップ、一時領域、回復領域では必要空きと増加速度が異なります。マウントポイントをドライブ文字だけで識別せず、UniqueIdやパスとの対応を構成管理します。予約領域や回復領域を空けるためにファイルを削除したり、ドライブ文字を付けたりしません。起動や回復を妨げる可能性があります。
空きGBと空き率の両方でしきい値を考える
100GBのボリュームで10%は10GB、10TBのボリュームで10%は1TBです。空き率だけでは大容量ボリュームで早すぎる警告、空きGBだけでは小容量ボリュームで遅すぎる警告になることがあります。OS更新、一時ファイル、データベース、ログ、バックアップなど用途別に必要な絶対容量と割合を組み合わせ、警告と重大のしきい値を設計します。
$volumes = Get-Volume | Where-Object { $_.Size -and $_.DriveLetter }
$volumes | Where-Object {
$_.SizeRemaining -lt 20GB -or
(100 * $_.SizeRemaining / $_.Size) -lt 10
} | Select-Object DriveLetter, Size, SizeRemaining
例の20GiBと10%は一般的な正解ではありません。アプリの最大一時使用量、Windows Update、メモリダンプ、データベース自動拡張、バックアップ保持、ログローテーションを考慮して環境ごとに決めます。取得値がNull、Sizeが0、ボリュームがオフラインの場合は警告計算へ入れず、Unknownとして別に通知します。警告発生時に自動削除へ直結させないことも重要です。
一回の空き容量より増加速度を監視する
障害予防では、現在の空きだけでなく、前日・前週から何GiB減ったか、いつ枯渇する見込みかを追います。端末名、Volume UniqueIdまたは役割、Size、SizeRemaining、取得時刻を同じ列で保存します。ドライブ文字は変更される場合があるため、重要サーバーではボリューム識別子とラベル、マウントパスを併用します。
単純な直線予測は、月次処理、バックアップ、更新、ログローテーションで大きく外れます。異常な急減を検知したら、どのディレクトリやアプリが増えたか、予定処理か、バックアップが失敗して保持が延びたかを確認します。監視データ自体にも端末名、ボリューム構成、内部パスが含まれるためアクセス制御と保管期限を設けます。高頻度の全ファイル走査はI/O負荷を生むので避けます。
空き不足を見つけても削除を自動化しない
空きが少ない場合、まず急増した場所、ログ保持、Windows一時領域、ユーザープロファイル、データベース、バックアップ、ダンプ、更新キャッシュを担当者と確認します。ファイルの所有者、保持義務、アプリの整合性、バックアップ状態を把握せずに削除すると、監査証跡、復旧ポイント、業務データを失います。システムフォルダーやデータベースファイルを直接消しません。
クリーンアップはWindowsや製品がサポートする機能を使い、対象、見積もり容量、メンテナンス時間、バックアップ、戻し方を決めます。ボリューム拡張も隣接未割り当て領域、パーティション方式、暗号化、Storage Spaces、仮想ディスク、クラウド側拡張が関係します。空き不足を理由にセキュリティログやバックアップを無断停止せず、容量計画と保管ポリシーを見直します。
確認結果を残すチェックリスト
- ボリューム空き、物理ディスク未割り当て、ネットワーク共有、クォータを区別したか
- Get-VolumeでSizeとSizeRemaining、HealthStatusを取得したか
- GiB換算方法と空き率の0除算・Nullを考慮したか
- Win32_LogicalDiskのDriveTypeと実際の物理構成を混同していないか
- Get-PSDriveが実行ユーザーとセッションから見える範囲であることを考慮したか
- ドライブ文字のないボリュームとマウントポイントを役割別に扱ったか
- 空きGB、空き率、増加速度を組み合わせ、削除を自動実行していないか
結果は、取得日時とタイムゾーン、端末名、Windowsのエディションとビルド、PowerShellの版、実行ユーザー、取得方法を添えて保存します。値が空または取得失敗の場合は、対象が存在しないと断定せず、権限、モジュール、OS、接続状態、リモート管理経路を確認します。再起動、削除、最適化、修復、設定変更が必要になったら読み取り確認と分離し、利用者への影響、バックアップ、承認、戻し方を決めます。

コメント