获取外部对象的属性

时间:2019-02-19 15:52:07

标签: powershell

如果我有这样的脚本:

$searchfor = @("wininit","TeamViewer")
Get-Process $searchfor | % { 
    Get-nettcpconnection -OwningProcess $_.ID |
    select @{Name='Process';Expression={(Get-Process -Id $_.OwningProcess).ProcessName }}
}

如何访问Get-Process $searchfor在我的select-object中返回的属性?

您可以在select表达式中看到,即使我感觉已经将信息传递给get-process

,也需要再次执行foreach-object

我知道我可以使用foreach($x in $y)而不是foreach-object,但是在使用管道时,有什么方法可以获取外部对象的属性?

1 个答案:

答案 0 :(得分:2)

使用-PipelineVariable (-pv)公共参数(PSv4 +)使每个Get-Process输出对象在随后的管道阶段的脚本块内可用:

$searchfor = 'wininit', 'TeamViewer'
# -PipelineVariable proc makes $proc available in script blocks later.
Get-Process $searchfor -PipelineVariable proc | % { 
  Get-NetTCPConnection -OwningProcess $_.ID |
    Select-Object @{Name='Process'; Expression={ $proc.ProcessName }}
}

注意:

  • 必须在没有$ 的情况下指定变量名称​​(-PipelineVariable proc,而不是
    -PipelineVariable $proc

  • (有意义的),该变量在管道本地(当命令终止时超出范围)。


也就是说,您可以定义一个辅助。脚本块中的变量:

$searchfor = 'wininit', 'TeamViewer'
Get-Process $searchfor | % { 
  # Save the input process object in an aux. variable.
  $proc = $_
  Get-NetTCPConnection -OwningProcess $_.ID |
    Select-Object @{Name='Process'; Expression={ $proc.ProcessName }}
}