我正在学习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理器中显示的是非常不同的。
你能告诉我我做错了什么吗?
你正在得到你期望在$processes
的PID。 这里的问题是,你正在看到从Start-Job
的输出,并混淆了它的作业 ID与你的PID输出。
你有2个notepad.exe在你的例子中运行,所以PowerShell根据需要运行2个作业。 ID 50
和52
只是分配给作业的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