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

我正在学习PowerShell,并试图看看如何使用variables和函数。 我想为所有正在运行的记事本实例打印出PID,基本上在“任务pipe理器”的“详细信息”选项卡下的“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,但是在任务pipe理器中显示的是非常不同的。

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

PID与ID

你正在得到你期望在$processes的PID。 这里的问题是,你正在看到从Start-Job的输出,并混淆了它的作业 ID与你的PID输出。

你有2个notepad.exe在你的例子中运行,所以PowerShell根据需要运行2个作业。 ID 5052只是分配给作业的ID。 要获得输出,您首先需要捕获它。

如果在脚本结尾处放置了Get-Job | Receive-Job Get-Job | Receive-Job你会看到你所期待的PID。 有关作业和作业输出的更多阅读,您可以在TechNet上找到一篇很棒的文章

然而

你为什么使用Start-Job ? 这部分是一个更大的脚本? 你应该可以使用Invoke-Command来传递scriptblock $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

选择只是PID记事本过程:

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

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

 Get-Job | select ID | Format-List 

产量

 Id : 2