Powershell: Windows PCのリソース状況をcsvに吐き出す

先日、Powershellでタイムスタンプの作り方で、CPUコアごとの負荷状況とメモリ使用率を記録するサンプルをメモに残しました。

今回はその改造版。

スクリプトで一定時間ごとに、CPU負荷状況とメモリ使用率を記録することは役に立つことは立ちますが、データの垂れ流し記録なので後処理が必要になります。例えば表計算ソフトで直接読み込むことが出来ませんし、何かの汎用的なフォーマットでもない。せっかく記録するなら一般的にはcsv形式のテキストファイルにしておけば、あとから情報処理するのも楽です。

という背景で修正したのが以下のソース。

CSVにする時に一番やっかいだったのが、CPUコアごとの負荷。CPUによってコア数が異なるため、単純に表計算ソフトのセルに1個ずつパラメータを入力すると、可変長のフィールドが出来て使いにくくなってしまいます。やむ得ないので、コアごとにコロン(:) で区切って一つのセルに収まるようにしました。コアごとじゃなくて、トータルCPU負荷でいいなら、こんな処理は要りません。

$c = get-credential
$h = "win10_01"
cd c:/temp
$logfile = "output.csv"
$cpu_load = ""

while (1){
$cpu = Get-WmiObject -ComputerName $h -Credential $c Win32_PerfFormattedData_PerfOS_Processor 
    $i = 0
    $current_date = (Get-Date -Format "yy/MM/dd HH:mm:ss")
 
    while ($i -lt $cpu.Length-1){
        $cpu_load = $cpu_load + $cpu.PercentProcessorTime[$i]+":"
        $i++
     }
$cpu_load_percent = $cpu_load -replace ":$",""
$cpu_load = ""

$mem_usage = [math]::Truncate((gwmi -ComputerName $h -Credential $c Win32_OperatingSystem | %{(($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)/$_.TotalVisibleMemorySize) * 100}))

$current_date+","+$cpu_load_percent+","+$mem_usage |Tee-Object -Append -FilePath $logfile
sleep 10
}

実行結果はこんな具合。
タイムスタンプ, CPU負荷, メモリ使用率
と並んで表示されます。と同時に、c:\temp\output.csv に表示されているものと同じ内容が記録されます。

20/01/02 17:03:12,100:100:100:100,60
20/01/02 17:03:23,100:100:100:100,64
20/01/02 17:03:34,100:100:100:100,64
20/01/02 17:03:44,12:0:0:0,44
20/01/02 17:03:55,5:5:0:0,40
20/01/02 17:04:05,0:0:0:0,40
20/01/02 17:04:16,0:0:0:5,40
20/01/02 17:04:27,6:0:6:0,39
20/01/02 17:04:37,0:0:0:0,42
20/01/02 17:04:48,12:19:25:6,44
20/01/02 17:04:59,100:100:100:100,45
20/01/02 17:05:09,100:100:100:100,46
20/01/02 17:05:21,43:43:25:19,47
20/01/02 17:05:32,100:100:100:100,47
20/01/02 17:05:43,18:37:25:25,47
20/01/02 17:05:55,100:100:100:100,47
20/01/02 17:06:10,100:100:100:100,48
20/01/02 17:06:21,100:100:100:100,48
20/01/02 17:06:31,100:100:100:100,50
20/01/02 17:06:42,100:100:100:100,50
20/01/02 17:06:54,100:100:100:100,50
20/01/02 17:07:05,100:100:100:100,50
20/01/02 17:07:15,100:100:100:100,52
20/01/02 17:07:26,100:100:100:100,55
20/01/02 17:07:37,100:100:100:100,54

メモリ使用率に関して、小数点以下を正確に記録しても大した意味はないので、[math]::trancateで丸めました。

パフォーマンス測定される側では特に何も準備する必要がないし、リモートから情報収集されていることにも気付く必要がないので、簡易的な負荷測定には便利だと思います。

コメントを残す