web-dev-qa-db-fra.com

Quittez une fonction PowerShell mais continuez le script

Cela peut sembler une question très très stupide, mais je ne peux pas vraiment le comprendre. J'essaie d'arrêter la fonction lorsqu'elle trouve son premier hit (match), puis de continuer avec le reste du script.

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'

Résultat souhaité:

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

J'ai essayé d'utiliser break, exit, continue et return mais rien de tout cela ne me donne le résultat souhaité. Merci de votre aide.

16
DarkLite1

Comme cela a été mentionné, Foreach-object est une fonction qui lui est propre. Utilisez un foreach régulier

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'
10
Andrey Marchuk

Le bloc de script que vous passez à ForEach-Object est une fonction à part entière. Un return dans ce bloc de script revient simplement de l'itération actuelle du bloc de script.

Vous aurez besoin d'un indicateur pour indiquer aux futures itérations de revenir immédiatement. Quelque chose comme:

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

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

Plutôt que cela, il vaut mieux utiliser un Where-Object pour filtrer les objets du pipeline uniquement sur ceux que vous devez traiter.

1
Richard