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.
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'
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.