PowerShellによるシステム情報取得

当連載の前回記事(第15回)で紹介したように、PowerShellでシステム情報を取得すると、単に情報を表示するだけでなく、その情報の加工が容易になります。従来の方法では、取得した情報はテキスト表示しかできなかったので、その情報を流用するにはテキストデータを読み取って加工するプログラムを組むか、あるいは直接システム情報にアクセスする本格的なプログラムをC#やC、Visual Basic等の開発環境で作成する必要がありました。この点、情報をオブジェクトとして取得するPowerShellでは、スクリプトの簡便さで、システム情報を利用できます。

前回に引き続き、もう少し、システム情報の取得例を紹介しましょう。

BIOS情報の取得

PCのBIOS情報もWMIオブジェクトとして取得できます。いちいちPC起動画面でBIOSセットアップメニューを確認したりする必要もありません。

BIOSオブジェクトの取得は以下の通りです。クラス名の探し方については、前回の連載第15回を参照して下さい。

本来、-Classオプションをつけて、「Get-WmiObject -Class Win32_BIOS」と実行すべきところですが、-Classの記述は省略できますので、単に「Get-WmiObject Win32_BIOS」とも記述できます。

gwmi  Win32_BIOS

Get-WmiObject(短縮形gwmi)で、BIOS情報を取得します。

ドライブ情報の取得

ドライブに関連する情報にはいくつかのクラスがありますので、簡単に紹介します。いずれも、接続しているドライブ情報(ディスク情報)をオブジェクト配列として取得します。

クラス名 内容
Win32_DiskDrive 接続しているディスク装置の情報。
Win32_LogicalDisk Cドライブ、Dドライブなど、論理的ドライブ情報。
Win32_MappedLogicalDisk ネットワークドライブのドライブ文字割り当て情報。
Win32_DiskPartition パーティション(ボリューム)情報。
Win32_LogicalDiskRootDirectory 論理ドライブのルートディレクトリ情報。
Win32_DiskQuota クォータの設定情報。
Win32_LogonSessionMappedDisk ログオンセッションとドライブ文字の割り当て情報。
Win32_LogicalDiskToPartition 論理ドライブのパーティションへの割り当て情報。
Win32_DiskDrivePhysicalMedia ディスク装置と物理的な装置の割り当て情報。
Win32_DiskDriveToDiskPartition ディスク装置とパーティションの割り当て情報。
Win32_PerfFormattedData_PerfDisk_LogicalDisk 論理ドライブのパフォーマンス監視情報。(パフォーマンスモニタなどに表示される情報)
Win32_PerfRawData_PerfDisk_LogicalDisk 論理ドライブのパフォーマンス監視情報。
Win32_PerfFormattedData_PerfDisk_PhysicalDisk ディスク装置のパフォーマンス監視情報。
Win32_PerfRawData_PerfDisk_PhysicalDisk ディスク装置のパフォーマンス監視情報。

良く使用する例として、論理ドライブ(Cドライブ、Dドライブなど)情報を活用してみましょう。

(1)論理ドライブの情報を取得します。Win32_LogicalDiskクラスのオブジェクトを取得して、DiskInfo変数に保存します。

$DiskInfo = gwmi Win32_LogicalDisk

Win32_LogicalDiskクラスのオブジェクトを取得して、DiskInfo変数に保存。

(2)DiskInfo変数の中身を表示してみます。

$DiskInfo | ft

DiskInfo変数の内容は、各ドライブの基本情報。それをFormat-Table(省略形ft)コマンドレットで表形式で表示します。

(3)DiskInfo変数(オブジェクト配列)から、Cドライブの情報を取得します。

$DiskInfo | ? {$_.DeviceID -eq "C:"}

Where-Objectコマンドレット(省略形?)で、DeviceIDが「C:」のオブジェクトを抽出します。

ここで、Win32_LogicalDiskのプロパティ名を確認しておきます。

(4)Cドライブ情報のオブジェクトから、プロパティを使って、全容量と、使用容量、空き容量を、GB単位で表示します。

$CDrive = $DiskInfo | ? {$_.DeviceID -eq "C:"}
"ディスク容量は" + $CDrive.Size / 1GB + "GBです。"
"使用容量は" + ([long]$CDrive.Size - [long]$CDrive.FreeSpace) / 1GB + "GB です。"
"空き容量は" + ($CDrive.Freespace) / 1GB + "GB です。"

各情報を表示。

WMIから取得した情報にはUnsigned Int64型の値があり、そのままでは演算できない場合があります。そのときは、[long]などを付けて型変換します。

※ この明示的に[long]で型変換しないと演算できない問題は、Windows Server 2008 R2やWindows 7では発生しません。Windows Server 2008 R2やWindows 7では[long]は不要です。

(5)(1)~(4)を踏まえて、指定したドライブの容量情報を表示するスクリプト、Get-DiskSpaceInfoを作ってみます。以下の内容を、Get-DiskSpaceInfo.ps1として保存して下さい。

$DriveName = $args[0]
$Drive = gwmi -Class Win32_LogicalDisk | ? {$_.DeviceID -eq $DriveName}
"ドライブ $DriveName"
"ディスク容量は`t" + $Drive.Size / 1GB + "GB です。"
"使用容量は`t" + ([long]$Drive.Size - [long]$Drive.Freespace) / 1GB + "GB です。"
"空き容量は`t" + ($Drive.Freespace) / 1GB + "GB です。"

メモ帳で、Get-DiskSpaceInfo.ps1を作成します。

Get-DiskSpaceInfo.ps1の実行結果。大文字小文字は区別しませんので、ドライブ文字は「C:」と指定しても「c:」と指定してもかまいません。

(6)GB単位にしたディスク容量の小数点以下が長すぎるので、小数点以下2桁に統一して表示することにします。この場合、ToStringメソッドで書式指定します。Get-DiskSpaceInfo.ps1を次のように修正します。

$DriveName = $args[0]
$Drive = gwmi -Class Win32_LogicalDisk | ? {$_.DeviceID -eq $DriveName}
"ドライブ $DriveName"
($Drive.Size / 1GB).ToString("ディスク容量は`t#,##.00GB です。")
(([long]$Drive.Size - [long]$Drive.FreeSpace)/1GB).ToString("使用容量は`t#,##.00GB です。")
($Drive.Freespace / 1GB).ToString("空き容量は`t#,##.00GB です。")

ToStringメソッドは、オブジェクトを単純に文字列化するだけでなく、フォーマット(書式)を指定することにより、所定のフォーマットの文字列にに加工できます。

※ 書式指定文字列の詳細は、以下のURLを参照して下さい。
http://msdn.microsoft.com/ja-jp/library/0c899ak8.aspx

ToString()メソッドを利用して、計算結果の書式を整えて表示します。

※ より完成度を高めるには、ドライブ文字を指定しなかった場合、間違ったドライブ文字を指定した場合のエラー処理を追加するといいでしょう。また、空き容量が少なくなったら警告を表示する、最も空き容量が大きいドライブを表示するなど、応用的なスクリプトプログラムも考えられます。