代码之家  ›  专栏  ›  技术社区  ›  paul deter

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

  •  1
  • paul deter  · 技术社区  · 10 年前

    我正在学习powershell,并试图了解如何使用变量和函数。我想打印所有正在运行的记事本实例的PID,基本上是任务管理器中Details选项卡下的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 回复  |  直到 10 年前
        1
  •  4
  •   Community CDub    4 年前

    PID与ID

    你得到了你期望的PID $processes 很好。这里的问题是,您看到的输出来自 Start-Job 并混淆了它 工作 ID与PID输出。

    示例中有2个notepad.exe正在运行,因此PowerShell会根据请求运行2个作业。ID 50 52 只是分配给作业的id。要获得所需的输出,首先需要捕获它。

    如果在你的脚本末尾 Get-Job | Receive-Job 你会看到你期待的PID。有关工作和工作产出的更多信息,您可以在 TechNet

    然而

    为什么要使用 启动作业 ? 这部分是更大的剧本吗?你应该能够使用 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 相反

        2
  •  0
  •   Soheil Hashemi    10 年前

    仅为记事本进程选择pid:

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

    要从你的工作中获得邮票,只需运行

    Get-Job | select ID | Format-List
    

    输出

    Id : 2