PowerShellの[Get-Process]コマンドでシステムプロセスを徹底管理!5つの具体的な利用例

PowerShellの コマンドでシステムプロセスを徹底管理!5つの具体的な利用例で重要なのは、実行例を増やすことより、対象と戻し方を先に確定することです。結論は「Get-Processは現在のprocess objectを読み取るcommandで、CPU propertyは瞬間使用率ではなく累積processor time、WorkingSetはその時点のphysical memory使用量です。名前、ID、開始時刻、pathを必要な範囲で取得し、停止は別command・別承認に分けます。」。ここではWindows PowerShell 5.1とPowerShell 7.xでpropertyや権限差を意識する条件を前提に、2026年7月17日時点の公式仕様から、現場で再現できる判断順を組み立てます。

目次

process instanceをIdとStartTimeで識別する

Get-Processの入力、出力、変更有無を一文で書き、host、user、current directory、実行時刻を添えます。異なるPowerShell版やhostのsnapshotを混ぜず、同じsampling条件でprocess instanceを追います。

  • $PSVersionTableとGet-Command Get-Processを記録する
  • Get-Process | Get-Memberで実際のpropertyとmethodを確認する
  • 対象process名だけでなくIdとStartTimeを取得する
  • 管理者権限が必要なpropertyはAccess deniedを欠損値と区別する

CPU・WorkingSet・PrivateMemoryの意味を分ける

必要な列だけ一覧

Get-Process |
  Select-Object ProcessName,Id,CPU,WorkingSet64,StartTime |
  Sort-Object WorkingSet64 -Descending |
  Select-Object -First 20

CPUは累積秒、WorkingSet64はbyteです。表示列を限定し、Format-Tableは画面表示の最後にだけ使います。StartTime取得に権限が足りないprocessはerrorになり得ます。

名前とIDで同一性を確認

Get-Process -Name notepad -ErrorAction SilentlyContinue |
  Select-Object ProcessName,Id,StartTime,Path

同名processは複数存在できます。再起動でIDが再利用され得るため、操作対象を決めるときは取得時刻とStartTimeも記録します。

二回測定してCPU増分を見る

$before=@{}
Get-Process -Name pwsh -ErrorAction SilentlyContinue | ForEach-Object { try { $before["$($_.Id)|$($_.StartTime.Ticks)"]=[double]$_.CPU } catch {} }
Start-Sleep -Seconds 2
Get-Process -Name pwsh -ErrorAction SilentlyContinue | ForEach-Object { try { $key="$($_.Id)|$($_.StartTime.Ticks)"; if($before.ContainsKey($key)){ [pscustomobject]@{ProcessName=$_.ProcessName;Id=$_.Id;CPUSecondsDelta=[math]::Round(([double]$_.CPU-$before[$key]),3)} } } catch {} }

瞬間CPU率が必要なら一定間隔の差分とlogical processor数、経過時間を使う設計が必要です。processが途中終了した場合は測定不能として扱います。

moduleとhandle情報を限定取得

Get-Process -Name explorer -Module -ErrorAction SilentlyContinue |
  Select-Object ModuleName,FileName,FileVersionInfo

-Moduleや-FileVersionInfoはaccess権やprocess architectureの影響を受けます。結果が欠けても存在しないと断定せず、権限errorを記録します。

CSVへsnapshot保存

Get-Process | Select-Object ProcessName,Id,CPU,WorkingSet64,StartTime |
  Export-Csv -LiteralPath .\process-snapshot.csv -NoTypeInformation -Encoding utf8

snapshotにはuser名やcommand lineを含めていません。それでも端末情報なので保存先のaccess権と保持期間を決め、既存fileを上書きしない名前を使います。

二回のsnapshotからCPU増分を求める

ProcessNameは実行file名から拡張子を除いた表示で、service名とは別です。CPUが空の場合は終了直後やaccess制約が考えられます。Handles、PM、NPM、WSの単位と意味は違い、単一snapshotだけでmemory leakを断定できません。時系列で同じprocess instanceを追い、event logやapplication telemetryと合わせて判断します。

access deniedと終了raceを欠損から分ける

Get-Processは通常読み取りですが、property accessでprotected processへerrorが出る場合があります。errorを避けるため常時administratorで動かすのではなく、必要な対象だけ権限を上げます。Stop-Processやprocess objectのKill methodはuser data消失やservice停止を招くため、この記事の確認手順から切り離します。停止が必要ならowner、影響、graceful shutdown、再起動方法を確認し、作業前snapshotと復旧手順を用意します。

Stop-Processを読み取り調査から切り離す

  • CPUを瞬間百分率と読む
  • WSを全memory使用量と断定する
  • 同名processを一つと仮定する
  • Format-Table後のobjectをCSVへ渡す
  • Access deniedをprocess不存在として扱う

Task Managerとsampling windowを合わせる

Task ManagerやPerformance Monitorと同時刻に比較し、単位とsampling windowを合わせます。Get-Processを5秒間隔で複数回取得し、IDとStartTimeが同じinstanceか確認します。保存CSVをImport-Csvで読み戻し、列と件数を検証します。調査終了後はsnapshotを規程に沿って保管または安全に廃棄します。

PowerShellのGet-Processを定期化するなら、正常件数、警告境界、停止条件を数値化します。

同一instanceの差分だけを合格にする

同名processは複数存在するため、CPU増分はNameの配列同士を減算せず、IdとStartTimeを複合keyにして同一instanceだけ比較します。CPUはprocess開始後の累積秒、WorkingSet64は時点値であり、終了したPIDや再利用されたPIDを差分対象から外します。

PIDとStartTimeを複合keyにした完成例

継続中・終了済み・取得errorを分類する

  • 同一instanceを比較:同じId+StartTimeが二回とも存在し、CPUSecondsDeltaが0以上のscalarになる
  • 測定中に終了:一回目だけに存在するprocessはExitedとして別件数へ分け、null差分を0に置換しない
  • property取得error:StartTime/Module access deniedやprocess終了競合はErrorRecordへ分け、全件成功に見せない

Get-Process -Name pwshが複数objectを返すと$a.CPUも配列になり、単純な$b.CPU-$a.CPUはObject[]減算errorになります。PIDだけも再利用の可能性があるためStartTimeを合わせ、CPUがnullのsystem processを除外します。

同名複数processとCPU nullを試す

$p=Get-Process -Name pwsh -ErrorAction SilentlyContinue
[pscustomobject]@{Count=@($p).Count;CpuPropertyType=if(@($p).Count){$p.CPU.GetType().FullName}else{'NoProcess'}}

同名1件・複数件、測定中終了、PID再利用を模したkey違い、CPU nullをtestします。before/after時刻、Id、StartTime、累積CPU、差分、除外理由を表へ保存します。

Nameだけの集計は再起動や同名processを混同します。before/afterのIdとStartTimeが一致する行だけ差分を計算し、途中終了とaccess拒否は0へ置換せず除外理由を残します。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次