2010年3月26日金曜日

Windows PowerShellで、消費メモリ量を表示してみる

Windows Power Shellは、消費メモリ量を詳細に表示する事が可能です。

そこで、ちょっとGET-MEMというコマンドを作ってみました。

GET-MEMと入力すると、メモリを消費しているプロセスが容量の多い順番に明細表示され、最後に合計メモリが表示される・・・という形にしてあります。

連番、プロセスID、名前、消費メモリ(MB単位)
という情報を出すようにしてあります。
(スクリーンショットは、プロセス名をモザイクで隠してありますがご了承下さい。)

今回はこれだけですが、さらに自分の欲しい情報を色々と追加すると便利かと思います。

今回の処理は、以下のように作ってみました。

ちなみに、プロセス情報は、Get-WMIObject Win32_Processで取得していますが、その際に、ただ取得するだけでなく、Windows Power Shell独特のパイプ処理でつなぎ、Sort-Objectにて、消費メモリ量の多い順(降順)でソートしています。

また、小数点以下は2桁にまとめていますが、[Math]::Round()を使っても良いのですが、見栄えを考えて、今回はstring型のメソッドToString("F2")でもって、書式変換で小数点以下2桁に丸める形をとってみました。


function global:Get-MEM()
{
 #--------------------
#変数定義
#--------------------
#プロセス情報を、消費メモリ量の降順にソートしながら取得
[object]$obj_m = $(Get-WMIObject Win32_Process | Sort-Object WorkingSetSize -desc);
#OS情報取得
[object]$obj_os= $(Get-WMIObject Win32_OperatingSystem);
#結果格納配列
[double[]]$dblArr_m = $(New-Object double[] 3);
[Int32]$i = 0;

 #--------------------
#処理部分
#--------------------
#残り物理メモリと仮想メモリを、MB単位に変換して結果配列に格納しておく。
$dblArr_m[1] = $obj_os.FreePhysicalMemory / 1024;
$dblArr_m[2] = $obj_os.FreeVirtualMemory / 1024;

#@@@@@@@@@@[LOOP-START]@@@@@@@@@@
for($i=0;$i -lt $obj_m.Length;$i++)
{
#消費メモリを集計(バイト単位)
$dblArr_m[0]+=$obj_m[$i].WorkingSetSize;

#消費プロセスの明細を表示
Write-Output $(
($i+1).ToString("000") + " " +
"[" + $obj_m[$i].ProcessId.ToString("0000000000") + "] " +
$obj_m[$i].Name.PadRight(30) +
($obj_m[$i].WorkingSetSize / [Math]::Pow(1024,2)).ToString("F2") + "MB"
);
}
#@@@@@@@@@@[LOOP-END ]@@@@@@@@@@

#消費メモリ量を、MB単位に変換して結果配列に格納しておく。
$dblArr_m[0] = $dblArr_m[0] / [Math]::Pow(1024,2);
Write-Output $("合計 [" + $i.ToString() + "]個のプロセスがメモリを消費しています。");
Write-Output $("----------------------------------------------------");
Write-Output $("  消費メモリ=" + $dblArr_m[0].ToString("F2") + "MB");
Write-Output $("----------------------------------------------------");
Write-Output $("空き物理メモリ=" + $dblArr_m[1].ToString("F2") + "MB");
Write-Output $("空き仮想メモリ=" + $dblArr_m[2].ToString("F2") + "MB");
}


コードをブログにコピーペーストしたら、インデントが消えてしまいましたが、このままにしておきます。
ご了承下さい。

ちなみに、このコマンドを実行しているパソコン「Aspire 1410」ですが、ミニノートパソコン(CULVノート)の身でありながら、64bitのWindows 7搭載なのが今更ながら嬉しい。
なにしろ、乗っけている物理メモリ4GBがキッチリ使えるわけです。

会社で使っているプログラム開発用のマシンは、スペックは強力ですけれど、32bitのWindowsを搭載しているため、4GBメモリを積んでいてもキッチリ使うのは無理。
プライベートのミニノートが、会社マシンに勝てる面があるのは、妙にワクワクしますね。