嵌套的Foreach-Object和Where-Object中的变量

时间:2014-11-03 13:44:38

标签: powershell

我想知道如何在Powershell中使用嵌套的Forach-Object,Where-Object和其他Cmdlet。例如这段代码:

$obj1 | Foreach-Object { 
    $obj2 | Where-Object { $_ .... }
}

因此,在Foreach-Object的代码块中,我使用$obj1的元素作为$_。但是在具有$obj2的Where-Object的代码块中也发生了同样的事情。那么如何访问Where-Object代码块中的两个对象元素呢?我必须做$_.Arg1 -eq $_.Arg1,但这没有任何意义。

3 个答案:

答案 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 }