如何获取任务管理器中显示的 运行 进程的进程 ID

how to get process id of a running process as shown in task manager

我正在学习 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,但任务管理器中显示的内容非常不同。

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

select 只是记事本进程的 pid :

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

为了从你的工作中获得邮票 运行 它只是

Get-Job | select ID | Format-List

输出

Id : 2

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