可以使用 Windows PowerShell 中的进程 cmdlet 来管理 Windows PowerShell 中的本地和远程进程。
获取进程 (Get-Process)
若要获取在本地计算机上运行的进程,请运行 Get-Process(不带参数)。
可以通过指定进程名称或进程 ID 来获取特定进程。以下命令可获取 Idle 进程:
PS> 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 找不到匹配项,它将生成错误,因为它的常见用途是检索已知的正在运行的进程。如果不存在具有该 ID 的进程,则很可能是 ID 不正确,或者感兴趣的进程已经退出:
PS> 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”开头的进程。
PS> 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 类是 Windows PowerShell 进程的基础,因此它遵从 System.Diagnostics.Process 使用的某些约定。其中一个约定是,可执行文件的进程名称永远不包括可执行文件名末尾的“.exe”。
Get-Process 还接受 Name 参数的多个值。
PS> 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 参数获取远程计算机上的进程。例如,以下命令可获取本地计算机(以“localhost”表示)和两台远程计算机上的 PowerShell 进程。
PS> 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 来显示进程对象的进程 ID、ProcessName 和 MachineName (ComputerName) 属性。
PS> 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 显示中。倒引号 (`) (ASCII 96) 为 Windows PowerShell 继续符。
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
停止进程 (Stop-Process)
Windows PowerShell 可让您灵活地列出进程,但如何停止进程呢?
Stop-Process cmdlet 使用 Name 或 Id 来指定希望停止的进程。是否能够停止进程取决于您的权限。某些进程不能停止。例如,如果试图停止空闲进程,则将获得错误:
PS> 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 参数强行进行提示。如果指定进程名称时使用通配符,则此参数特别有用,因为您可能意外匹配一些不想停止的进程:
PS> 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,可以进行复杂的进程操作。由于进程对象有 Responding 属性,当进程不再响应时该属性将为 True,因此可以用以下命令停止所有无响应的应用程序:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
您可以在其他情况下使用相同的方法。例如,假设当用户启动另一个应用程序时辅助的通知区域应用程序自动运行。您可能发现这在终端服务会话中无法正常进行,但仍想使它在物理计算机控制台上运行的会话中持续进行。连接到物理计算机桌面的会话的会话 ID 始终是 0,因此通过使用 Where-Object 和进程 SessionId,可以停止其他会话中的所有进程实例:
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}
停止所有其他 Windows PowerShell 会话
可能偶尔需要能够停止除了当前会话以外所有正在运行的 Windows PowerShell 会话。如果会话正在使用太多资源,或者不可访问(它可能正在远程运行,或者在另一个桌面会话中),则可能无法直接停止它。但是,如果试图停止所有正在运行的会话,则可能终止当前会话。
每个 Windows PowerShell 会话都有环境变量 PID,其中包含 Windows PowerShell 进程的 ID。可以对照每个会话的 ID 检查 $PID 并仅终止具有不同 ID 的 Windows PowerShell 会话。以下管道命令执行此操作,并返回已终止会话的列表(由于使用了 PassThru 参数):
PS> 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
启动、调试和等待进程
Windows PowerShell 还附带了一些 cmdlet,用于启动(或重新启动)、调试进程以及在运行命令之前等待进程完成。有关这些 cmdlet 的信息,请参阅每个 cmdlet 的 cmdlet 帮助主题。
另请参阅