使用 Process Cmdlet 管理進程
此範例僅適用於 Windows PowerShell 5.1。
您可以使用 PowerShell 中的 Process Cmdlet 來管理 PowerShell 中的本機和遠端進程。
取得處理程序
若要取得在本機電腦上執行的程序,請執行不帶參數的 Get-Process
。
您可以藉由指定其行程名稱或進程識別碼來取得特定進程。 下列命令會取得閒置程序:
Get-Process -Id 0
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
0 0 0 16 0 0 Idle
雖然在某些情況下,Cmdlet 不返回任何資料是正常的,但是當您依其 ProcessId指定進程時,Get-Process
如果找不到匹配項則會產生錯誤,因為通常的意圖是擷取已知正在執行的進程。 如果沒有具有該識別碼的進程,可能是識別碼不正確或感興趣的程式已經結束:
Get-Process -Id 99
Get-Process : No process with process ID 99 was found.
At line:1 char:12
+ Get-Process <<<< -Id 99
您可以使用 Get-Process
Cmdlet 的 Name 參數,根據行程名稱指定進程子集。 Name 參數可以在逗號分隔清單中採用多個名稱,而且它支援使用通配符,因此您可以輸入名稱模式。
例如,下列命令會取得名稱開頭為 「ex」 的進程。
Get-Process -Name ex*
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
234 7 5572 12484 134 2.98 1684 EXCEL
555 15 34500 12384 134 105.25 728 explorer
因為 .NET System.Diagnostics.Process 類別是 PowerShell 程式的基礎,所以它會遵循 System.Diagnostics.Process所使用的一些慣例。 其中一項慣例是可執行檔的進程名稱永遠不會在可執行檔名稱結尾包含 .exe
。
Get-Process
也接受 Name 參數的多個值。
Get-Process -Name exp*,power*
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
540 15 35172 48148 141 88.44 408 explorer
605 9 30668 29800 155 7.11 3052 powershell
您可以使用 Get-Process
的 ComputerName 參數,在遠端電腦上取得進程。 例如,下列命令會取得本機電腦上的 PowerShell 程序(以“localhost”表示)和兩台遠端電腦上。
Get-Process -Name powershell -ComputerName localhost, Server01, Server02
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
258 8 29772 38636 130 3700 powershell
398 24 75988 76800 572 5816 powershell
605 9 30668 29800 155 7.11 3052 powershell
計算機名稱在此顯示中並不明顯,但它們會儲存在 Get-Process
傳回之進程物件的 MachineName 屬性中。 下列命令會使用 Format-Table
Cmdlet 來顯示進程 識別子、ProcessName 和 MachineName (ComputerName) 屬性。
Get-Process -Name powershell -ComputerName localhost, Server01, Server01 |
Format-Table -Property Id, ProcessName, MachineName
Id ProcessName MachineName
-- ----------- -----------
3700 powershell Server01
3052 powershell Server02
5816 powershell localhost
這個更複雜的命令會將 MachineName 屬性新增至標準 Get-Process
顯示。
Get-Process powershell -ComputerName localhost, Server01, Server02 |
Format-Table -Property Handles,
@{Label="NPM(K)";Expression={[int]($_.NPM/1024)}},
@{Label="PM(K)";Expression={[int]($_.PM/1024)}},
@{Label="WS(K)";Expression={[int]($_.WS/1024)}},
@{Label="VM(M)";Expression={[int]($_.VM/1MB)}},
@{Label="CPU(s)";Expression={if ($_.CPU -ne $()){$_.CPU.ToString("N")}}},
Id, ProcessName, MachineName -Auto
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName MachineName
------- ------ ----- ----- ----- ------ -- ----------- -----------
258 8 29772 38636 130 3700 powershell Server01
398 24 75988 76800 572 5816 powershell localhost
605 9 30668 29800 155 7.11 3052 powershell Server02
停止進程
PowerShell 可讓您彈性列出進程,但停止進程呢?
Stop-Process
Cmdlet 會採用 名稱 或 識別碼 來指定您想要停止的進程。 您停止進程的能力取決於您的許可權。 某些進程無法停止。 例如,如果您嘗試停止閑置的進程,就會收到錯誤:
Stop-Process -Name Idle
Stop-Process : Process 'Idle (0)' cannot be stopped due to the following error:
Access is denied
At line:1 char:13
+ Stop-Process <<<< -Name Idle
您也可以使用 Confirm 參數來強制提示。 如果您在指定行程名稱時使用通配符,這個參數特別有用,因為您可能會不小心比對一些您不想停止的進程:
Stop-Process -Name t*,e* -Confirm
Confirm
Are you sure you want to perform this action?
Performing operation "Stop-Process" on Target "explorer (408)".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
(default is "Y"):n
Confirm
Are you sure you want to perform this action?
Performing operation "Stop-Process" on Target "taskmgr (4072)".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
(default is "Y"):n
使用某些物件篩選 Cmdlet,可以實現複雜的過程操作。 因為 Process 物件具有 回應 屬性,所以當它不再回應時,您可以使用下列命令停止所有非回應的應用程式:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
在其他情況下,您可以使用相同的方法。 例如,假設當用戶啟動另一個應用程式時,次要通知區域應用程式會自動執行。 您可能會發現,這在終端機服務會話中無法正常運作,但仍想要將它保留在實體計算機控制臺上執行的會話中。 連接到物理電腦桌面的會話一律擁有 0 的會話識別碼,因此,您可以使用 Where-Object
和程序來停止其他會話中的所有程序實例,會話識別碼:
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process
Stop-Process
Cmdlet 沒有 ComputerName 參數。 因此,若要在遠端電腦上執行停止進程命令,您必須使用 Invoke-Command
Cmdlet。 例如,若要停止 Server01 遠端電腦上的 PowerShell 進程,請輸入:
Invoke-Command -ComputerName Server01 {Stop-Process PowerShell}
停止所有其他 PowerShell 工作階段
有時候,能夠停止所有正在執行的 PowerShell 會話而不影響當前會話,可能會很實用。 如果工作階段使用太多資源或無法存取(它可能從遠端或在另一個桌面工作階段中執行),您可能無法直接停止它。 不過,如果您嘗試停止所有執行中的會話,則目前的會話可能會改為終止。
每個 PowerShell 會話都有環境變數 PID,其中包含 Windows PowerShell 程式 識別符。 您可以針對每個會話的標識符檢查$PID,並只終止具有不同標識符的 Windows PowerShell 會話。下列管線命令會執行這項作業,並傳回終止的會話清單(因為使用 PassThru 參數):
Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} |
Stop-Process -PassThru
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
334 9 23348 29136 143 1.03 388 powershell
304 9 23152 29040 143 1.03 632 powershell
302 9 20916 26804 143 1.03 1116 powershell
335 9 25656 31412 143 1.09 3452 powershell
303 9 23156 29044 143 1.05 3608 powershell
287 9 21044 26928 143 1.02 3672 powershell
啟動、偵錯和等候進程
PowerShell 也隨附 Cmdlet 來啟動(或重新啟動)、偵錯進程,並等候進程在執行命令之前完成。 如需這些 Cmdlet 的相關信息,請參閱每個 Cmdlet 的 Cmdlet 說明主題。