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へ置換せず除外理由を残します。

コメント