PowerShell
Comportement de retour dans PowerShell
Recherche…
Introduction
Il peut être utilisé pour quitter la portée actuelle, qui peut être une fonction, un script ou un bloc de script. Dans PowerShell, le résultat de chaque instruction est renvoyé en tant que sortie, même sans mot-clé Return explicite ou pour indiquer que la fin de la portée a été atteinte.
Remarques
Vous pouvez en savoir plus sur la sémantique de retour sur la page about_Return de TechNet ou en appelant get-help return
partir d'une invite PowerShell.
Question (s) Q & A notable (s) avec plus d'exemples / d'explications:
- Valeur de retour de fonction dans PowerShell
- PowerShell: la fonction n'a pas de valeur de retour correcte
about_return sur MSDN l'explique succinctement:
Le mot-clé Return permet de quitter une fonction, un script ou un bloc de script. Il peut être utilisé pour quitter une étendue à un point spécifique, pour renvoyer une valeur ou pour indiquer que la fin de la portée a été atteinte.
Les utilisateurs familiarisés avec des langages tels que C ou C # peuvent vouloir utiliser le mot-clé Return pour rendre la logique de laisser une portée explicite.
Dans Windows PowerShell, les résultats de chaque instruction sont renvoyés en tant que sortie, même sans instruction contenant le mot clé Return. Les langages comme C ou C # renvoient uniquement la ou les valeurs spécifiées par le mot-clé Return.
Sortie anticipée
function earlyexit {
"Hello"
return
"World"
}
"Bonjour" sera placé dans le pipeline de sortie, "Monde" ne sera pas
Je t'ai eu! Retour dans le pipeline
get-childitem | foreach-object { if ($_.IsReadOnly) { return } }
Les applets de commande de pipeline (par exemple, ForEach-Object
, Where-Object
, etc.) fonctionnent sur les fermetures. Le retour ici ne déplacera que le prochain élément du pipeline, et ne quittera pas le traitement. Vous pouvez utiliser break au lieu de return si vous souhaitez quitter le traitement.
get-childitem | foreach-object { if ($_.IsReadOnly) { break } }
Je t'ai eu! Ignorer les sorties indésirables
Inspiré par
function bar {
[System.Collections.ArrayList]$MyVariable = @()
$MyVariable.Add("a") | Out-Null
$MyVariable.Add("b") | Out-Null
$MyVariable
}
Le Out-Null
est nécessaire car la méthode .NET ArrayList.Add
renvoie le nombre d'éléments dans la collection après l'ajout. Si omis, le pipeline aurait contenu 1, 2, "a", "b"
Il existe plusieurs façons d'omettre les sorties indésirables:
function bar
{
# New-Item cmdlet returns information about newly created file/folder
New-Item "test1.txt" | out-null
New-Item "test2.txt" > $null
[void](New-Item "test3.txt")
$tmp = New-Item "test4.txt"
}
Remarque: pour en savoir plus sur les raisons de préférer > $null
, voir [sujet non encore créé].
Retour avec une valeur
(paraphrasé de about_return )
Les méthodes suivantes auront les mêmes valeurs sur le pipeline
function foo {
$a = "Hello"
return $a
}
function bar {
$a = "Hello"
$a
return
}
function quux {
$a = "Hello"
$a
}
Comment travailler avec les fonctions retourne
Une fonction renvoie tout ce qui n'est pas capturé par autre chose.
Si vous utilisez le mot-clé return , chaque instruction après la ligne de retour ne sera pas exécutée!
Comme ça:
Function Test-Function
{
Param
(
[switch]$ExceptionalReturn
)
"Start"
if($ExceptionalReturn){Return "Damn, it didn't work!"}
New-ItemProperty -Path "HKCU:\" -Name "test" -Value "TestValue" -Type "String"
Return "Yes, it worked!"
}
Fonction de test
Reviendra:
- Début
- La clé de registre nouvellement créée (ceci est dû au fait que certaines instructions créent une sortie inattendue)
- Oui, ça a marché!
Test-Function -ExceptionalReturn Reviendra:
- Début
- Bon sang, ça n'a pas marché!
Si vous le faites comme ceci:
Function Test-Function
{
Param
(
[switch]$ExceptionalReturn
)
. {
"Start"
if($ExceptionalReturn)
{
$Return = "Damn, it didn't work!"
Return
}
New-ItemProperty -Path "HKCU:\" -Name "test" -Value "TestValue" -Type "String"
$Return = "Yes, it worked!"
Return
} | Out-Null
Return $Return
}
Fonction de test
Reviendra:
- Oui, ça a marché!
Test-Function -ExceptionalReturn Reviendra:
- Bon sang, ça n'a pas marché!
Avec cette astuce, vous pouvez contrôler la sortie renvoyée, même si vous n'êtes pas sûr de la nature de chaque instruction.
Ça marche comme ça
.{<Statements>} | Out-Null
la . rend le scriptblock suivant inclus dans le code
le {} marque le bloc de script
le | Out-Null pousse toute sortie inattendue vers Out-Null (donc c'est parti!)
Parce que le scriptblock est inclus, il obtient la même étendue que le reste de la fonction.
Vous pouvez donc accéder aux variables qui ont été créées dans le scriptblock.