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

时间:2015-03-27 19:06:54

标签: windows powershell taskmanager

我正在学习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            ...                      

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

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

2 个答案:

答案 0 :(得分:4)

PID与ID

您正在$processes获得您期望的PID。这里的问题是您正在查看Start-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

答案 1 :(得分:0)

为记事本流程选择仅pid:

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

从你的工作中获取邮票只需

Get-Job | select ID | Format-List

输出

Id : 2