PowerShellによるシステム情報取得のメリット
システム管理を行う上で、システム情報を取得しなければならないことがままあります。今回は、システム情報の取得方法を紹介します。従来のコマンドやユーティリティでもシステム情報を取得することはできますが、基本的にテキストとして出力するだけ、あるいは画面に表示するだけなので、取得したシステム情報を加工してなんらかの処理に利用するためには本格的なプログラムを作成する必要がありました。
一方、PowerShellで取得したシステム情報はオブジェクトなので、PowerShellで容易に加工できます。たとえば、システム情報を所定の書式に整形して表示あるいは保存したり、集計したり、システム情報の内容によってプログラムの動作を変えたりできます。
環境変数の取得
システム既定の環境変数は、最も簡単に取得できるシステム情報です。特にユーザー環境に関する情報を得るには手軽です。
たとえば環境変数SystemDriveには、Windowsのシステムドライブが、HOMEPATHにはユーザーのホームパスが格納されています。
これらの環境変数の一覧を表示するには、Get-ChildItem(短縮形gci)コマンドレットで、PSドライブ(PowerShellのプロバイダ)としてEnv:を指定します。
※ PSプロバイダ、PSドライブの変更については、当連載の第5回の記事を参照して下さい。
gci env:
特定の環境変数の値を表示するには、「env:環境変数名」として指定します。
gci env:USERNAME
なお、式の中で環境変数の値を利用する時は、「$env:USERNAME」というように$マークを付けます。
変数名と$
PowerShellを使用していると、var1というように変数名だけを記述するケースと、$var1のように$マークを付けて記述するケースがあるので注意が必要です。変数名自体には$マークはありません。一方、$マークは変数の内容にアクセスする記号と考えられます。 たとえば、Get-ChildItemやNew-Item、Remove-Itemなど、操作対象として変数を指定するコマンドレットに指定する時は、$マーク無しで変数名だけを記述します。しかし、$var2 = $var1 + 256のように式の中で変数の値を操作するには$マークが必要です。
WMIの活用...wmicコマンド
ハードウェアやBIOSの情報など、さらに詳細なシステム情報の取得にはWMI(Windows Management Instrumentation)というしくみを使用します。従来はコマンドラインでwmicコマンドを使用しました。たとえば、OSの情報を取得したい時は、「wmic os」と実行します。OS情報中のバージョン情報を取得したい時は、「wmic os get version」と実行します。
あるいは、wmicコマンドだけを実行するとwmicのプロンプトを表示します。その中で、「os get version」などのコマンドを実行します。
wmic
wmicの使用方法についてはここでは詳説しません。知りたい方は、「wmic /?」として実行して下さい。wmicプロンプトで使用できるオプションやコマンド(os、biosなど。正しくはエイリアス)の一覧を確認し、各エイリアスについても、wmicプロンプトで「os /?」というように/?オプションを使用して、使用法を確認できます。wmicプロンプトを終了する時は「exit」と入力します。また、wmicプロンプトで「os /?」などとする代わりに、コマンドプロンプトで「wmic os /?」と実行することも出来ます。
PowerShellでWMI活用
PowerShellでもWMIを活用することができます。WMI利用の基本となるコマンドレットはGet-WmiObject(短縮形 : gwmi)です。WMIクラスやWMIオブジェクトを取得します。
PowerShellでWMIを活用する例を紹介します。
(1) WMIにどんなクラスがあるのか、一覧を確認します。「gwmi -List」と実行すると、取得できるWMIオブジェクトのクラス一覧を表示します。
このままでは使いにくいので、一度変数WmiListに保存しましょう。
(2) WMIクラスの数を確認します。
Get-WmiObject -Listの出力結果を代入した変数WmiListはWMIクラス情報の配列変数です。配列変数の要素数は変数の.Lengthプロパティで知ることができます。
※ いちいち変数に代入せずにクラス数だけを取得したい時などは、「(Get-WmiObject -List).Length」と実行すれば、Get-WmiObject -Listの実行を結果のオブジェクトから直接.Lengthプロパティを取得できます。
(3) 欲しい情報をもつオブジェクトのクラス名がわからないとき、Get-WmiObject -Listの実行結果から、あたりを付けて検索します。具体的には、Where-Objectコマンドレット(省略形 ?またはwhere)を使って、$WmiListから条件にあったオブジェクトを取り出します。Get-ChildItemの結果をWhere-Objectで絞り込んでファイル名を表示したりするのと同じです。
コマンドプロンプトのワイルドカードを使うなら、-like演算子を使って以下のパターンを指定します。
$WmiList | ? { $_.Name -like "Win32*Operating*" }
UNIX系の正規表現になれているのであれば、-match演算子を使います。
$WmiList | ? { $_.Name -match "Win32.*Operating" }
これで、目的のオブジェクトのクラス名がWin32_OperatingSystemであることがわかります。
※ -likeと-matchでは文字列パターンの設定方法が違うので、注意が必要です。詳細は、文字列比較演算子については「help about_comparison_operator」、ワイルドカードについては「help about_wildcard」、正規表現については「help about_regular_expression」と実行してヘルプを確認して下さい。
(4) 目的のオブジェクトのクラス名が分かったので、今度は、Get-WmiObjectでそのオブジェクトを取り出せば、OS情報を確認できます。
Get-WmiObject Win32_OperatingSystem
バージョン番号だけを取り出したいのであれば、取り出したオブジェクトのVersionプロパティを参照します。
Get-WmiObjectの出力結果から直接参照する場合。
(Get-WmiObject Win32_OperatingSystem).Version
Get-WmiObjectの出力結果を一度変数に入れて参照する場合。
$WmiOS = Get-WmiObject Win32_OperatingSytem
$WmiOS.Version
取り出したWmiObjectを、PowerShellコマンドレットを使って整形することも出来ます。たとえば表に整形するコマンドレットFormat-Table(省略形ft)を使えば、以下のようになります。
$WmiOS | ft -AutoSize
PowerShellでは、取り出したバージョン情報の大小を数値として比較し、バージョンによって動作を変えるプログラムも作成できます。こうした応用はPowerShellの特長といえます。
if ( $WmiOS.Version -ge 6.0 ) {
Write-Host "Windows Vista以降のバージョンです。"
} else {
Write-Host "Windows XP/Windows Server 2003までのバージョンです。"
}