当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 Process cmdlet 管理进程

作者:精品下载站 日期:2024-12-14 03:02:46 浏览:13 分类:玩电脑

使用 Process cmdlet 管理进程


此示例仅适用于 Windows PowerShell 5.1。

您可以使用 PowerShell 中的 Process cmdlet 来管理 PowerShell 中的本地和远程进程。

获取进程

要让进程在本地计算机上运行,请运行不带参数的 Get-Process

您可以通过指定进程名称或进程 ID 来获取特定进程。以下命令获取 Idle 进程:

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 可能不正确或者感兴趣的进程已经退出:

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参数来获取远程计算机上的进程。例如,以下命令获取本地计算机(由“localhost”表示)和两台远程计算机上的 PowerShell 进程。

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 显示进程 IDProcessNameMachineName (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 采用NameId 来指定要停止的进程。您停止进程的能力取决于您的权限。有些进程无法停止。例如,如果您尝试停止空闲进程,则会收到错误:

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

您还可以使用确认参数强制提示。如果您在指定进程名称时使用通配符,则此参数特别有用,因为您可能会意外匹配某些您不想停止的进程:

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 对象具有 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}

停止所有其他 PowerShell 会话

有时,能够停止除当前会话之外的所有正在运行的 PowerShell 会话可能会很有用。如果会话使用太多资源或无法访问(它可能正在远程运行或在另一个桌面会话中运行),您可能无法直接停止它。但是,如果您尝试停止所有正在运行的会话,则当前会话可能会被终止。

每个 PowerShell 会话都有一个环境变量 PID,其中包含 Windows PowerShell 进程的 Id。您可以根据每个会话的 ID 检查 $PID,并仅终止具有不同 ID 的 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 帮助主题。

参见

  • Get-Process
  • Stop-Process
  • Start-Process
  • Wait-Process
  • Debug-Process
  • Invoke-Command

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯