PowerShellでWindowsプロセスを管理する方法【取得・起動・停止・リモート管理を解説】
PowerShellには、ローカルコンピュータやリモートコンピュータ上のプロセスを管理するための豊富な機能が備わっています。PowerShellを使えば、実行中のプロセス一覧の取得、応答しなくなったプロセスの強制終了、ウィンドウタイトルによるプロセスの検索、新しいプロセスの非表示モードや対話モードでの起動など、さまざまな操作が可能です。
利用可能なプロセス管理コマンドレットの一覧
Windows 10で利用できるプロセス管理コマンドレットの一覧は、以下のコマンドで表示できます。
Get-Command –Noun Process
- Get-Process – 実行中のWindowsプロセスの一覧を取得する
- Start-Process – プロセス(プログラム)を起動する
- Stop-Process – プロセスを強制停止(強制終了)する
- Debug-Process – プロセスをデバッグする
- Wait-Process – プロセスが終了するまで待機する
Get-Process:実行中のプロセス一覧を取得する
Get-Processコマンドレットを使用すると、ローカルコンピュータ上で実行中のプロセスの一覧を表示できます。
デフォルトでは、実行中のプロセスについて以下のプロパティが表示されます。
- Handles – そのプロセスが開いている入出力ファイルディスクリプタ(ハンドル)の数
- NPM(K) – ノンページドメモリ(非ページプール)。ディスクにページングされないプロセスデータのサイズ(KB)
- PM(K) – ページングされる可能性があるプロセスメモリのサイズ
- WS(K) – プロセスが使用している物理メモリのサイズ(KB)(ワーキングセット)
- CPU(s) – プロセスが使用したCPU時間(全CPUの合計時間)
- ID – 一意のプロセス識別子
- SI(セッションID) – プロセスのセッションID(0は全セッション、1は最初にログオンしたユーザー、2は2番目にログオンしたユーザーのセッションを意味します)
- ProcessName – プロセス名
複数プロセスの全プロパティを表示する
複数のプロセスのすべてのプロパティを一覧表示するには、次のコマンドを使用します。
Get-Process cmd,excel,notep* | Format-List *
特定のプロパティのみを表示することもできます。たとえば、プロセス名(ProcessName)、開始時刻(StartTime)、ウィンドウタイトル(MainWindowTitle)、実行ファイルのパス(Path)、開発元(Company)を表示するには以下のようにします。
Get-Process winword, notep* | Select-Object ProcessName, StartTime, MainWindowTitle, Path, Company|ft
GUIを持つユーザープロセスのみを表示する
GUIを持つ実行中のユーザープロセスのみを表示するには(バックグラウンドプロセスやシステムプロセスは表示されません)、次のコマンドを実行します。
Get-Process | Where-Object {$_.mainWindowTitle} | Format-Table Id, Name, mainWindowtitle
IncludeUserNameオプションを使用すると、プロセスを起動したユーザー名(所有者)を表示できます。
Get-Process -Name winword -IncludeUserName
メモリ使用量でプロセスを絞り込む
Where-Objectを使えば、条件に合致するプロセスだけを抽出できます。たとえば、300MB以上のRAMを使用しているすべてのプロセスを、メモリ使用量の降順でソートし、KBの代わりにMBで表示するには、次のようにします。
Get-Process| where-object {$_.WorkingSet -GT 300000*1024}|select processname,@{l="Used RAM(MB)"; e={$_.workingset / 1mb}} |sort "Used RAM(MB)" –Descending
CPU使用率(%)を表示する
先述のとおり、Get-ProcessコマンドレットのCPUパラメータには、各プロセスが使用したプロセッサ時間が秒単位で格納されています。タスクマネージャーのようにプロセスのCPU使用率(%)を表示したい場合は、次の関数を使用します。
function Get-CPUUsagePercent
{
$CPUPercent = @{
Name = 'CPUPercent'
Expression = {
$TotalSec = (New-TimeSpan -Start $_.StartTime).TotalSeconds
[Math]::Round( ($_.CPU * 100 / $TotalSec), 2)
}
}
Get-Process | Select-Object -Property Name, $CPUPercent, Description | Sort-Object -Property CPUPercent -Descending | Select-Object -First 20
}
Get-CPUUsagePercent
応答しない(ハングした)プロセスを検出する
応答しなくなったプロセスを検索するには、次のコマンドを実行します。
Get-Process | where-object {$_.Responding -eq $false}
Start-Process / Stop-Process:PowerShellでプロセスを起動・停止する方法
PowerShellで新しいプロセスを起動するには、次のコマンドを使用します。
Start-Process -FilePath notepad
実行ファイルが$env:path環境変数に含まれていない場合は、ファイルへの完全なパスを指定します。
Start-Process -FilePath 'C:\distr\app.exe'
プログラムを起動して引数を渡すこともできます。
Start-Process -FilePath ping -ArgumentList "-n 10 10.1.56.21"
ウィンドウの表示モードを指定する
WindowStyleオプションを使用すると、プロセスのウィンドウ表示モード(通常、最小化、最大化、非表示)を指定できます。たとえば、プログラムを最大化したウィンドウで起動し、プロセスが終了するまで待機するには、次のコマンドを実行します。
Start-Process -FilePath tracert -ArgumentList "10.1.56.21" –wait -windowstyle Maximized
プロセスを停止する
Stop-Processコマンドレットを使用すると、任意のプロセスを停止できます。たとえば、実行中のすべてのメモ帳(notepad)プロセスを閉じるには次のようにします。
Stop-Process -Name notepad
デフォルトでは、プロセスを強制終了する際の確認は求められず、指定した条件に合致するすべてのプロセスが停止されます。停止前に確認を求めたい場合は、–Confirmオプションを追加します。
Stop-Process -Name notepad.exe -Confirm
また、次のような方法でもプロセスを終了できます。
(Get-Process -Name cmd).Kill()
さらに、PowerShellから、Windowsのプロセスマネージャーに応答していないすべてのアプリケーションを強制停止することも可能です。
Get-Process | where-object {$_.Responding -eq $false}| Stop-Process
この仕組みを応用すれば、ハングしたり終了したりしたプロセスを自動的に再起動させることもできます。
PowerShellでリモートコンピュータのプロセスを管理する
Get-ProcessコマンドレットのComputerNameオプションを使用すると、リモートコンピュータ上のプロセスを管理できます(WinRMが有効化・構成されている必要があります)。
Get-Process -ComputerName srv01, srv02, srv03| Format-Table -Property ProcessName, ID, MachineName
ここでは、リモートコンピュータのプロセス管理に使えるGet-Processの組み込み機能を扱います。Invoke-CommandやEnter-PSSessionコマンドレットで利用できるPowerShellリモーティング機能については、ここでは割愛します。
リモートコンピュータ上のプロセスを強制終了する
リモートコンピュータ上のプロセスを強制終了したい場合は注意が必要です。Stop-Processコマンドレットには–ComputerNameパラメータが存在しません。リモートコンピュータ上のプロセスを停止するには、次のようなPowerShellコードを使用します。
$RemoteProcess = Get-Process -Name cmd -ComputerName srv01
Stop-Process -InputObject $RemoteProcess
このように、Get-Processでリモートのプロセスオブジェクトを取得し、それをStop-Processの-InputObjectパラメータに渡すことで、リモートマシン上のプロセスを停止できます。
-
Windows 11/10でプロセスが管理者権限で実行されているか確認する方法
Windowsでは、多くのプログラムが管理者権限(昇格された特権)で実行されています。プログラムを正しく動作させるために昇格された権限が必要なプロセスもあれば、そのような権限を必要としないプロセスもあります。どのプロセスが管理者権限で実行されているのかを確認したい場合は、この記事の手順に従ってください。 以前の記事では、エクスプローラーを昇格モード(管理者として)で開く方法をご紹介しました。そのときのヒントを応用すれば、同じWindowsのネイティブ機能を使って、管理者権限で実行されているプロセスを見つけ出すことができます。該当するプロセスが見つかったら、必要に応じて終了させたり、そのまま実行
-
Windows 10でPowerShellを使ってインストール済みプログラムの一覧を作成する方法
Windows 10のPCを長く使っていると、知らないうちに多くのプログラムがインストールされており、すべてを覚えておくのは意外と難しいものです。Windows PowerShellを使えば、コンピューターにインストールされているプログラムの一覧を簡単に生成でき、さまざまな場面で活用できます。たとえば、新しいPCをセットアップするときに「必要なソフトウェアのインストール漏れがないか」を確認したいときなどに便利です。本記事では、Windows 10でPowerShellを使ってインストール済みプログラムを確認する手順をわかりやすく解説します。PowerShellでインストール済みプログラムの一覧