PowerShell gwmi コマンドで簡単にシステム情報を変数に取り込めると書きました。
CPUやメインボードのように、PC内に一つしかないデバイスの情報を取り込むのは、前メモ通り簡単なのですが、複数インストールされている可能性があるデバイスについては面倒な場合があります。
例えば、メモリDIMM、HDD、NIC、モニター などで、1つの事もありますし、複数のこともあります。
$var = (gwmi -class win32_xxxx).something と書いて、変数に代入したとして、変数の中身がどうなっているかわかりませんから、CSVとして出力し、Excel に取り込んだ時点で書式が合わない!となってしまう可能性があります。
メモリを例に取れば、複数DIMMが導入されている場合に、次のようにコマンドを発行すると、
> (gwmi -ComputerName . -Class Win32_PhysicalMemory).capacity 1073741824 1073741824
こういう結果になります。この結果はそのまま使えないので、一度別の形に変換する必要があります。
余談ですが、合計メモリ容量を求めたいのであれば、別のコマンドがあります。
> (gwmi -class win32_computersystem).TotalPhysicalMemory 2133897216
わざわざ、Win32_PhysicalMemoryクラスを使用しなくても、OS側から値を持ってくれば解決します。
PowerShell の場合、こういう複数行を一つの変数に入れざるを得ない場合、各要素にアクセスしたい場合は次のようにしてアクセスできます。
> (( gwmi -class win32_physicalmemory).capacity)[0] 1073741824 > (( gwmi -class win32_physicalmemory).capacity)[1] 1073741824 > (( gwmi -class win32_physicalmemory).capacity)[2]
前述の変数と項目をピリオドで結びつけるのに加えて、[n] を付けることにより要素一つ一つを扱うことが出来ます。
ただし、メモリスロットが何個あるのか、その中の何個が使われているのか(つまり、[n] の n の値)は、別に求める必要があります。
上の例は、ASRock AD2700-ITX の二つのメモリバンクに各1GBのDIMMを入れている場合の実行結果です。3番目のメモリバンクは存在しないのですが、指定してもエラーにはならず、空になるだけです。