2016-04-26 4 views
8

Das mag wie eine sehr sehr dumme Frage erscheinen, aber ich kann es nicht wirklich herausfinden. Ich versuche, die Funktion zu beenden, wenn sie ihren ersten Treffer (Übereinstimmung) findet und dann mit dem Rest des Skripts fortfährt.Verlassen Sie eine PowerShell-Funktion, aber setzen Sie das Skript fort

Code:

Function Get-Foo { 
    [CmdLetBinding()] 
    Param() 

    1..6 | ForEach-Object { 
     Write-Verbose $_ 
     if ($_ -eq 3) { 
      Write-Output 'We found it' 

      # break : Stops the execution of the function but doesn't execute the rest of the script 
      # exit : Same as break 
      # continue : Same as break 
      # return : Executes the complete loop and the rest of the script 
     } 
     elseif ($_ -eq 5) { 
      Write-Output 'We found it' 
     } 
    } 
} 

Get-Foo -Verbose 

Write-Output 'The script continues here' 

Wunschergebnis:

VERBOSE: 1 
VERBOSE: 2 
VERBOSE: 3 
We found it 
The script continues here 

Ich habe versucht, mit break, exit, continue und return aber keiner von ihnen erhalten mir das gewünschte Ergebnis. Danke für Ihre Hilfe.

Antwort

6

Wie bereits erwähnt, Foreach-object ist eine Funktion für sich. Verwenden Sie regelmäßig foreach

Function Get-Foo { 
[CmdLetBinding()] 
Param() 

$a = 1..6 
foreach($b in $a) 
{ 
    Write-Verbose $b 
    if ($b -eq 3) { 
     Write-Output 'We found it' 
     break 
    } 
    elseif ($b -eq 5) { 
     Write-Output 'We found it' 
    } 
    } 
} 

Get-Foo -Verbose 

Write-Output 'The script continues here' 
+0

Perfekt! Dies ist das erste und einzige Beispiel, das funktioniert! Danke Andrey :) – DarkLite1

+0

Dies scheint gut zu 'foreach ($ b in (1..6)) {Pause}' – DarkLite1

0

Der Skriptblock, den Sie an ForEach-Object übergeben, ist eine eigenständige Funktion. Ein return in diesem Skriptblock kehrt nur von der aktuellen Iteration des Skriptblocks zurück.

Sie benötigen eine Markierung, um zukünftigen Iterationen mitzuteilen, dass sie sofort zurückkehren sollen. Etwas wie:

$done = $false; 
1..6 | ForEach-Object { 
    if ($done) { return; } 

    if (condition) { 
    # We're done! 
    $done = $true; 
    } 
} 

Anstatt dies, können Sie besser sein, ein Where-Object mit den Pipeline-Objekte nur filtern diejenigen, die Sie bearbeiten müssen.

+0

Ich versuche Ihr Beispiel, aber ich kann es nicht zum Laufen bringen. Kannst du meine verwenden und anpassen, damit ich das Ergebnis sehen kann? Was auch immer ich tue, es iteriert immer noch über die anderen Zahlen im Stream "Verbose" – DarkLite1

Verwandte Themen