2014-11-03 14 views
14

Zastanawiam się, jak pracować z zagnieżdżonymi obiektami typu Forach-Object, Where-Object i innymi Cmdlets w Powershell. Na przykład ten kod:Zmienne w zagnieżdżonych Foreach-Object i Where-Object

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

Więc w bloku kodu Foreach-Object Używam elementów $obj1 jak $_. Ale to samo dzieje się w bloku kodu Where-Object z $obj2. Jak więc uzyskać dostęp do obu elementów obiektów w bloku kodu Where-Object? Musiałbym zrobić $_.Arg1 -eq $_.Arg1, ale to nie ma sensu.

Odpowiedz

19

afaik, Będziesz musiał zachować odniesienie do zewnętrznej pętli, umieszczając ją w zmiennej lokalnej.

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

Innym sposobem rozwiązania tego problemu jest nie z slighty inny foreach

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

nadal sprowadza się do about_Scopes. $_ jest zawsze odniesieniem do bieżącego zakresu. Jak zapewne wiesz, ($_.Arg1 -eq $_.Arg1) będzie po prostu odnosić się do siebie.

+0

Wiem o "prawdziwej" pętli foreach, ale szukam rozwiązania dla dokładnie tego problemu, ponieważ dzieje się to w różnych sytuacjach. Może to być również bez Foreach-Object. – Michael

+0

@Michael to musisz zapisać zmienną, aby była dostępna dla innych zakresów, takich jak Lieven i sugeruję. – Matt

+0

@Matt, czy '$ _' ma odwołanie do obiektu macierzystego, które może być użyte w tych sytuacjach? Coś jak '$ itemArray | % {$ _. childArray | % {$ _. Parent.ParentProperty}} ' – craig