我正在学习 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 ...
这里有两个问题。
1.我只想要PID,它有很多。
2. 我希望上面输出中的 Id 是 PID,但任务管理器中显示的内容非常不同。
你能告诉我我做错了什么吗?
PID 与 ID
您将获得您期望的 PID$processes
正好。这里的问题是您看到的输出Start-Job
并混淆了它的JobID 与您的 PID 输出。
您的示例中运行了 2 个 notepad.exe,因此 PowerShell 根据请求运行 2 个作业。身份证号码50
and 52
只是分配给作业的 ID。要获得您正在寻找的输出,您首先需要捕获它。
如果在你的脚本的末尾你放了Get-Job | Receive-Job
你会看到你所期望的 PID。有关工作和工作产出的更多阅读,您可以找到一篇很棒的文章TechNet
However
你为什么使用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
}
Warning
虽然这在您使用的 PowerShell 5.0 中不是问题Write-Host
对于您示例中的输出。如果您需要在另一个函数中使用该输出,您应该考虑调用Write-Output
反而。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)