PowerShell
Retourgedrag in PowerShell
Zoeken…
Invoering
Het kan worden gebruikt om het huidige bereik te verlaten, wat een functie, script of scriptblok kan zijn. In PowerShell wordt het resultaat van elke instructie geretourneerd als uitvoer, zelfs zonder een expliciet Return-trefwoord of om aan te geven dat het einde van het bereik is bereikt.
Opmerkingen
U kunt meer lezen over de terugkeer-semantiek op de about_Return- pagina op TechNet, of door gebruik te get-help return
van een get-help return
van een PowerShell-prompt.
Opmerkelijke vragen en antwoorden met meer voorbeelden / uitleg:
about_return op MSDN legt het bondig uit:
Het Return-trefwoord verlaat een functie, script of scriptblok. Het kan worden gebruikt om een bereik op een specifiek punt af te sluiten, een waarde te retourneren of om aan te geven dat het einde van het bereik is bereikt.
Gebruikers die bekend zijn met talen zoals C of C #, kunnen het trefwoord Return gebruiken om de logica van het expliciet laten van een scope te maken.
In Windows PowerShell worden de resultaten van elke instructie als uitvoer geretourneerd, zelfs zonder een instructie die het trefwoord Return bevat. Talen zoals C of C # retourneren alleen de waarde of waarden die zijn opgegeven met het trefwoord Return.
Vroege exit
function earlyexit {
"Hello"
return
"World"
}
"Hallo" wordt in de uitvoerpijplijn geplaatst, "Wereld" niet
Gotcha! Keer terug in de pijplijn
get-childitem | foreach-object { if ($_.IsReadOnly) { return } }
Pijplijn-cmdlets (bijvoorbeeld: ForEach-Object
, Where-Object
, enz.) Werken op sluitingen. De retour hier wordt alleen verplaatst naar het volgende item op de pijplijn, niet bij het verlaten van de verwerking. U kunt break gebruiken in plaats van return als u de verwerking wilt afsluiten.
get-childitem | foreach-object { if ($_.IsReadOnly) { break } }
Gotcha! Negeren van ongewenste uitvoer
Geïnspireerd door
function bar {
[System.Collections.ArrayList]$MyVariable = @()
$MyVariable.Add("a") | Out-Null
$MyVariable.Add("b") | Out-Null
$MyVariable
}
De Out-Null
is noodzakelijk omdat de .NET ArrayList.Add
methode het aantal items in de verzameling retourneert na toevoeging. Indien weggelaten, zou de pijplijn 1, 2, "a", "b"
Er zijn meerdere manieren om ongewenste uitvoer weg te laten:
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"
}
Opmerking: zie [onderwerp nog niet gemaakt] voor meer informatie over waarom > $null
voorkeur > $null
.
Retourneer met een waarde
(geparafraseerd van about_return )
De volgende methoden hebben dezelfde waarden op de pijplijn
function foo {
$a = "Hello"
return $a
}
function bar {
$a = "Hello"
$a
return
}
function quux {
$a = "Hello"
$a
}
Hoe te werken met functies keert terug
Een functie retourneert alles dat niet door iets anders wordt vastgelegd.
Als u gebruik maken van de return sleutelwoord, zal elke verklaring na de retourleiding niet worden uitgevoerd!
Soortgelijk:
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!"
}
Test-functie
Zal terugkomen:
- Begin
- De nieuw gemaakte registersleutel (dit komt omdat er enkele verklaringen zijn die uitvoer genereren die u misschien niet verwacht)
- Ja, het werkte!
Testfunctie -Exceptionele terugkeer Keert terug:
- Begin
- Verdorie, het werkte niet!
Als je het zo doet:
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
}
Test-functie
Zal terugkomen:
- Ja, het is gelukt!
Testfunctie -Exceptionele terugkeer Keert terug:
- Verdorie, het werkte niet!
Met deze truc kun je de geretourneerde uitvoer beheren, zelfs als je niet zeker weet wat elke instructie zal uitspugen.
Het werkt zo
.{<Statements>} | Out-Null
de . maakt het volgende scriptblok opgenomen in de code
de {} markeert het scriptblok
de | Out-Null leidt elke onverwachte output naar Out-Null (dus het is weg!)
Omdat het scriptblok is opgenomen, krijgt het hetzelfde bereik als de rest van de functie.
Je hebt dus toegang tot variabelen die in het scriptblok zijn gemaakt.