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
ドライブ情報の取得
ドライブに関連する情報にはいくつかのクラスがありますので、簡単に紹介します。いずれも、接続しているドライブ情報(ディスク情報)をオブジェクト配列として取得します。
クラス名 | 内容 |
---|---|
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
(2)DiskInfo変数の中身を表示してみます。
$DiskInfo | ft
(3)DiskInfo変数(オブジェクト配列)から、Cドライブの情報を取得します。
$DiskInfo | ? {$_.DeviceID -eq "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 です。"
(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
※ より完成度を高めるには、ドライブ文字を指定しなかった場合、間違ったドライブ文字を指定した場合のエラー処理を追加するといいでしょう。また、空き容量が少なくなったら警告を表示する、最も空き容量が大きいドライブを表示するなど、応用的なスクリプトプログラムも考えられます。