如何获取正在运行的进程的进程ID,如任务管理器中所示

Posted

技术标签:

【中文标题】如何获取正在运行的进程的进程ID,如任务管理器中所示【英文标题】:how to get process id of a running process as shown in task manager 【发布时间】:2015-03-27 19:06:54 【问题描述】:

我正在学习 powershell,并试图了解如何使用变量和函数。我想打印出所有正在运行的记事本实例的 PID,基本上是在任务管理器的详细信息选项卡下的 PID 列中显示的内容。我写了以下代码

$cmd = 
  param($abc)
  Write-Host $abc


$processes = Get-Process -Name notepad | Select -ExpandProperty ID 
foreach ($process in $processes) 
 
    Start-Job -ScriptBlock $cmd -ArgumentList $process

我得到以下结果。

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
50     Job50           BackgroundJob   Running       True            localhost            ...                      
52     Job52           BackgroundJob   Running       True            localhost            ...                      

这里有两个问题。 1.我只想要PID,它有很多。 2. 我希望上面输出中的 Id 是 PID,但在任务管理器中显示的是非常不同的。

你能告诉我我做错了什么吗?

【问题讨论】:

【参考方案1】:

PID 与 ID

您在$processes 中获得了您所期望的PID。这里的问题是您看到来自 Start-Job 的输出并将其 Job ID 与您的 PID 输出混淆。

您的示例中运行了 2 个 notepad.exe,因此 PowerShell 根据要求运行 2 个作业。 ID 5052 只是分配给作业的 ID。要获得您正在寻找的输出,您首先需要捕获它。

如果您在脚本末尾输入Get-Job | Receive-Job,您会看到您所期望的PID。有关工作和工作输出的更多信息,您可以在 TechNet 上找到一篇很棒的文章

然而

你为什么使用Start-Job?这部分是一个更大的脚本吗?您应该可以使用Invoke-Command 将脚本块$cmd 传递给它。

$cmd = 
  param($abc)
  Write-Host $abc


$processes = Get-Process -Name notepad | Select -ExpandProperty ID 
foreach ($process in $processes) 
    Invoke-Command -ScriptBlock $cmd -ArgumentList $process

警告

虽然这在 PowerShell 5.0 中不是问题,但您在示例中使用 Write-Host 进行输出。如果您需要在另一个函数中使用该输出,您应该考虑改为调用Write-Output

【讨论】:

我改变了答案 tnx 我更喜欢 Start-Job 的解决方案,因为我计划在 $cmd 中添加一些长时间运行的作业。您能否将您的答案更新为如何使用 Jobs 来做到这一点 @pauldeter 没有问题,这在我对Get-Job | Receive-Job 的回答中有所提及。还有其他方法可以处理工作输出,这是您的下一个研究任务:)。 @Matt 您的答案是使用 Invoke-Command。您可以使用 Start-Job 更新它吗?我不确定如何在这里使用 Get-Job。 @pauldeter 这是“但是”上方的行,您可以将其作为最后一行。我的回答旨在满足您的需求提供替代解决方案。【参考方案2】:

只为记事本进程选择 pid:

 Get-Process -Name chrome | select Id | Format-List

为了从你的工作中获得印章,只需运行它

Get-Job | select ID | Format-List

输出

Id : 2

【讨论】:

我想你可能误解了。作业 ID 和进程 ID 之间没有关联。 @Matt 当我从任务管理器中选择进程标识符时显示,并且我看到 pid 与来自 `Get-Process -Name chrome | 的 Id 结果没有区别选择 ID | Format-List` 不正确? 请看我的回答。我想我知道混乱是什么。

以上是关于如何获取正在运行的进程的进程ID,如任务管理器中所示的主要内容,如果未能解决你的问题,请参考以下文章

在任务管理器中查找应用程序而不是进程的批处理文件

VB.Net从任务管理器中隐藏进程[重复]

如何在任务管理器中使用不同的进程名称(对于当前进程)名称?

C# 杀掉系统中的进程

如何在windows任务管理器中查找oracle.exe进程对应实例

在任务管理器中更改进程名称[重复]