2012-04-23 99 views
41

退出我有以下代碼:如何從的foreach對象在PowerShell中

$project.PropertyGroup | Foreach { 
    if($_.GetAttribute('Condition').Trim() -eq $propertyGroupConditionName.Trim()) { 
     $a = $project.RemoveChild($_); 
     Write-Host $_.GetAttribute('Condition')"has been removed."; 
    } 
}; 

問題1:如何從退出的ForEach?我嘗試使用「休息」和「繼續」,但它不起作用。

問題#2:我發現我可以修改foreach循環內的列表...我們不能在C#中這樣做......爲什麼PowerShell允許我們這樣做?

回答

69

Item#1。在foreach循環內放置break會退出循環,但不會停止管道。這聽起來像你想要的東西是這樣的:

$todo=$project.PropertyGroup 
foreach ($thing in $todo){ 
    if ($thing -eq 'some_condition'){ 
     break 
    } 
} 

項目#2。 PowerShell允許您修改該陣列上的foreach循環內的數組,但這些更改在退出循環之前不會生效。嘗試運行下面的代碼作爲示例。

$a=1,2,3 
foreach ($value in $a){ 
    Write-Host $value 
} 
Write-Host $a 

我無法對爲何PowerShell中的作者允許對此有何評論,但大多數其他腳本語言(PerlPython和外殼)允許類似的結構。

+0

我想你的意思是在你的循環中添加一行''a = 1..23;'來表明更改不會反映在循環執行中。 – ruffin 2015-06-09 21:44:22

+1

項目#2不正確(至少在v5中使用固定大小的陣列)。您可以修改該數組,並在'ForEach'構造中使其可見。如果要在ForEach結構中添加'$ a [1] = 9',它將顯示9作爲第二個元素,但不能從數組中添加/移除元素,並且使用「+」 ='運營商將不會顯示,直到結束。如果不是固定大小的數組(即'$ a = [System.Collections.ArrayList @(1,2,3)'),那麼任何修改內容的嘗試都將導致'集合被修改;枚舉操作可能不會執行。「錯誤,終止循環。 – Adrian 2016-01-26 20:19:30

+1

這是一個完全不正確的答案。問題在於「Foreach-Object」。在powershell中(主要討厭gotcha btw)'foreach'是一個「運算符」和一個「別名」。在這個答案中由smeltplate提供的'foreach'是「操作符」而不是「別名」。請參閱[這裏。](https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object/)注意:這個答案是一個完整的重構代碼,並可能無法適用於許多情況。 – 2017-07-16 00:40:52

6

要停止其中ForEach-Object部分的流水線,只需在ForEach-Object下的腳本塊中使用語句continue即可。當您在foreach(...) {...}ForEach-Object {...}中使用它時,continue的行爲會有所不同,這就是可能性。如果你想在流水線上繼續生產物體而丟棄一些原始物體,那麼最好的辦法是用Where-Object進行過濾。

+0

+1中斷了異常。有趣。我從來不知道這一點。無論您使用「break」還是「continue」,似乎都是一樣的。我想知道爲什麼這個問題不適用於這個問題的作者,因爲他們說他們都試過。 – BACON 2017-08-22 22:35:47

+0

任何想法,這是記錄在案? ['about_break'](https://docs.microsoft.com/powershell/module/microsoft.powershell.core/about/about_break)和['about_continue'](https://docs.microsoft.com/powershell/module /microsoft.powershell。core/about/about_continue)只談'for','foreach','while'和'switch'語句。 ['ForEach-Object'](https://docs.microsoft.com/powershell/module/microsoft.powershell.core/foreach-object)沒有提及「break」或「continue」。 – BACON 2017-08-22 22:35:53

+0

這對我不起作用 - 我在Get-ADGroupMember上得到了一個繼續例外 – PeterX 2018-02-02 03:48:23

-1

要在ForEach-Object管道內「繼續」,只需使用return。它的確如你所期望的continue所做的那樣:跳過塊的其餘部分並繼續下一次迭代。

+0

我需要退出循環 - 我得到了帶有break的異常並繼續...並且返回只是爲了處理Get-ADGroupMember – PeterX 2018-02-02 03:49:34