SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Graphical を使用して PowerShell でグラフを描画

without comments

PowerShell でグラフの描画をしようとしたとき、Chart Control を使用してグラフを作成するという方法があります。

単純なグラフがこれ以外の方法で描画できないかなと思い探してみたところ、Graphical というモジュールが手軽に使えそうでしたので、少し試してみました。

Install-Module -Name Graphical

を実行することで PowerShell Gallery からインストールすることができます。
SQL Server のバッチ実行数をグラフ化するような、次のようなスクリプトを作成してみました。

Clear-Host
$con = New-Object System.Data.SqlClient.SqlConnection("Server=localhost;Integrated Security=SSPI")
$dt = New-Object System.Data.DataTable
$results = New-Object System.Collections.Generic.List[int]
$con.Open()
$cmd = $con.CreateCommand()
$cmd.CommandText = "select getdate() AS collect_Date, cntr_value from sys.dm_os_performance_counters where counter_name ='Batch Requests/sec'"
$reader = $cmd.ExecuteReader()
$dt.Load($reader)
$old_collect_date = $dt.Rows[0].collect_Date
$old_cntr_value = $dt.Rows[0].cntr_value
$dt.Clear()
$cntr = 0
try {
    while ($true) {
        Start-Sleep -Seconds 1
        $reader = $cmd.ExecuteReader()
        $dt.Load($reader)
        $results.Add([int](($dt.Rows[0].cntr_Value - $old_cntr_value) / (($dt.Rows[0].collect_Date - $old_collect_date).TotalMilliseconds / 1000)))
        $old_collect_date = $dt.Rows[0].collect_Date
        $old_cntr_value = $dt.Rows[0].cntr_value
        $dt.Clear()
        if ($results.Count -gt 1) {
            if ($cntr % 5 -eq 0) {
                Clear-Host
                Show-Graph -Type Line -Datapoints $results -YAxisStep 50 -GraphTitle "Batch Req"
                $cntr = 0
            }
        }
        if($results.count -gt 50){
            $results.RemoveRange(0,10)
        }
        $cntr += 1
    }
}
catch {
    Write-Host $Error[0]
}
finally {
    Write-Host "Processing completed"
    $con.Close()
    $con.Dispose()
}

実際に実行したときの結果がこちらになります。
image
VS Code + PowerShell 6.2 の環境で実行しているのですが、グラウの描画できていますね。

フォントによってはグラフが崩れることがありますので、Consolas あたりにしておけば、日本語環境の PowerShell ISE でも表示できるかと。
線グラフだけでなく、棒グラフや散布図も作成することができますので、スクリプトで取得している結果を、手軽に可視化したいときには便利そうです。
imageimage

Written by Masayuki.Ozawa

1月 21st, 2020 at 11:17 pm

Posted in PowerShell

Tagged with

Leave a Reply