2014-11-03 61 views
14

我想知道如何在Powershell中嵌套Forach-Object,Where-Object和其他Cmdlet。例如,这代码:嵌套的Foreach对象和Where对象的变量

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

所以在FOREACH - 对象的代码块I用的$obj1元素作为$_。但是在Where-Object的代码块中,$obj2也是如此。那么如何访问Where-Object代码块中的两个对象元素?我将不得不做$_.Arg1 -eq $_.Arg1,但这没有任何意义。

回答

19

afaik,你需要通过把它放在一个局部变量中来保留对外部循环的引用。

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

另一种方式就解决这个问题是一个略低不同的foreach

ForEach($item in $obj1){ 
    $obj | Where-Object{$_.arg -eq $item.arg} 
} 

仍然归结为about_Scopes$_始终是对当前范围的引用。正如你必须知道($_.Arg1 -eq $_.Arg1)只是指自己。

+0

我知道一个“真正的”foreach循环,但我正在为这个问题寻找一个解决方案,因为这发生在不同的情况。它也可能没有Foreach-Object。 – Michael 2014-11-03 14:05:15

+0

@Michael那么你必须保存这个变量,以便像Lieven和我建议的其他范围一样。 – Matt 2014-11-03 14:50:50

+0

@Matt,'$ _'是否有可以在这些情况下使用的父对象引用?像'$ itemArray | %{$ _。childArray | %{$ _。Parent.ParentProperty}}' – craig 2016-09-22 13:16:02