✍️blog

技術系のこととか

PowerShellでメモリ監視

少し前にPowerShellで各プロセスのメモリ使用量を取得する方法をまとめました。

sabiz.hateblo.jp

せっかくなのでそれを使ってメモリ監視するスクリプトを書いてみました。

github.com

起動させるとこんな感じで、メモリ使用率とメモリ使用量の多いプロセストップ5が表示されます。
定期的に情報を再取得して再描画するようになっています。
PowerShellの窓さえ立ち上げておけばよいのでそこそこ軽いかなと思います。

合間でサッと作ったので作りは荒いですw

このままだとただのスクリプトの紹介でしかないので、

このスクリプトを書く上で必要だった要素を2つまとめていきます。

メモリ使用率の取得

メモリ使用率はWMIから計算可能です。

以下のコマンドでWMIを取得します。

Get-CimInstance Win32_OperatingSystem

learn.microsoft.com

取得したWMIの中の TotalVisibleMemorySize が総メモリサイズ、FreePhysicalMemoryが空きメモリサイズになります。

これらを使ってメモリ使用率は以下のように求めることができます。

 Get-CimInstance Win32_OperatingSystem | %{(($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)/$_.TotalVisibleMemorySize)}

コンソールの情報取得やカーソル位置の変更

コンソールの情報は以下で取得可能です。

> $Host.UI.RawUI

ForegroundColor       : Gray
BackgroundColor       : Black
CursorPosition        : 0,44
WindowPosition        : 0,0
CursorSize            : 25
BufferSize            : 160,45
WindowSize            : 160,45
MaxWindowSize         : 160,45
MaxPhysicalWindowSize : 1904,63
KeyAvailable          : True
WindowTitle           : C:\ - PowerShell 7.3 (9896)

$hostは自動変数で、現在のコンソールの情報を保持しています。そこを辿って RawUI というプロパティに諸々の情報が格納されています。

learn.microsoft.com

今回のスクリプトではカーソル位置の変更を使いました。

以下のような感じでカーソル位置の変更が可能です。

$cursorPos = $host.UI.RawUI.CursorPosition
$cursorPos.X = 10
$cursorPos.Y = 5
$host.UI.RawUI.CursorPosition = $cursorPos

理由は不明ですが、$host.UI.RawUI.CursorPosition.X = 10 のように直接代入してもカーソル位置は変わらないです。
ReadOnlyなのかな。。


普段所謂プログラミング言語でコードを書いていると
久々にシェルスクリプトもそうですが、PowerShellに触れると構文というか考え方というか雰囲気が変わるので
一瞬、アレっ?てなりますよね。

via GIPHY