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() }
実際に実行したときの結果がこちらになります。
VS Code + PowerShell 6.2 の環境で実行しているのですが、グラウの描画できていますね。
フォントによってはグラフが崩れることがありますので、Consolas あたりにしておけば、日本語環境の PowerShell ISE でも表示できるかと。
線グラフだけでなく、棒グラフや散布図も作成することができますので、スクリプトで取得している結果を、手軽に可視化したいときには便利そうです。