我正在学习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,但任务管理器中显示的内容非常不同。
你能告诉我我做错了什么吗?
答案 0 :(得分:4)
您正在$processes
获得您期望的PID。这里的问题是您正在查看Start-Job
的输出并将其作业 ID与您的PID输出混淆。
您的示例中有2个notepad.exe正在运行,因此PowerShell根据请求运行2个作业。 ID 50
和52
只是分配给作业的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