我想知道如何在Powershell中使用嵌套的Forach-Object,Where-Object和其他Cmdlet。例如这段代码:
$obj1 | Foreach-Object {
$obj2 | Where-Object { $_ .... }
}
因此,在Foreach-Object的代码块中,我使用$obj1
的元素作为$_
。但是在具有$obj2
的Where-Object的代码块中也发生了同样的事情。那么如何访问Where-Object代码块中的两个对象元素呢?我必须做$_.Arg1 -eq $_.Arg1
,但这没有任何意义。
答案 0 :(得分:32)
afaik,您需要通过将外部循环放在局部变量中来保留对外部循环的引用。
$obj1 | Foreach-Object {
$myobj1 = $_
$obj2 | Where-Object { $_ .... }
}
答案 1 :(得分:6)
解决这个问题的另一种方法是使用稍微不同的foreach
ForEach($item in $obj1){
$obj | Where-Object{$_.arg -eq $item.arg}
}
仍归结为about_Scopes。 $_
始终是对当前范围的引用。你必须知道($_.Arg1 -eq $_.Arg1)
只会引用自己。
答案 2 :(得分:2)
如果匹配足够简单,可以去掉内部代码块,避免使用局部变量。
$obj1 | Foreach-Object {
$obj2 | Where property -eq $_.property
}
例如:
$array = ("zoom", "explorer", "notreal")
$array | foreach { get-process | where ProcessName -EQ $_ | Out-Host }