PowerShell
Återvändbeteende i PowerShell
Sök…
Introduktion
Det kan användas för att lämna det aktuella omfånget, som kan vara en funktion, skript eller skriptblock. I PowerShell returneras resultatet av varje uttalande som utgång, även utan ett uttryckligt Return-nyckelord eller för att indikera att slutet på räckvidden har uppnåtts.
Anmärkningar
Du kan läsa mer om retursemantiken på About_Return- sidan på TechNet eller genom att åberopa get-help return
från en PowerShell-prompt.
Noterbara frågor och frågor med fler exempel / förklaring:
about_return på MSDN förklarar det kortfattat:
Return-nyckelordet lämnar en funktion, skript eller skriptblock. Det kan användas för att lämna ett omfång på en specifik punkt, för att returnera ett värde eller för att indikera att slutet på omfånget har uppnåtts.
Användare som känner till språk som C eller C # kanske vill använda sökordet Return för att göra logiken för att lämna en räckvidd uttrycklig.
I Windows PowerShell returneras resultaten för varje uttalande som output, även utan ett uttalande som innehåller sökordet Return. Språk som C eller C # returnerar bara värdet eller värdena som anges av Return-nyckelordet.
Tidig utgång
function earlyexit {
"Hello"
return
"World"
}
"Hej" kommer att placeras i utgångsrörledningen, "Värld" kommer inte
Fick dig! Återgå i rörledningen
get-childitem | foreach-object { if ($_.IsReadOnly) { return } }
Rörlednings-cmdlets (ex: ForEach-Object
, Where-Object
, etc) fungerar på stängningar. Returen här flyttas bara till nästa objekt på pipeline, inte avslutande bearbetning. Du kan använda paus istället för att returnera om du vill avsluta behandlingen.
get-childitem | foreach-object { if ($_.IsReadOnly) { break } }
Fick dig! Ignorerar oönskad utgång
Inspirerad av
function bar {
[System.Collections.ArrayList]$MyVariable = @()
$MyVariable.Add("a") | Out-Null
$MyVariable.Add("b") | Out-Null
$MyVariable
}
Out-Null
är nödvändigt eftersom metoden .NET ArrayList.Add
returnerar antalet objekt i samlingen efter att ha lagt till. Om utelämnad skulle rörledningen innehålla 1, 2, "a", "b"
Det finns flera sätt att utelämna oönskad produktion:
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"
}
Obs! För att lära dig mer om varför du föredrar > $null
, se [ämnet ännu inte skapat].
Återvänd med ett värde
(omskriven från om_return )
Följande metoder har samma värden på pipeline
function foo {
$a = "Hello"
return $a
}
function bar {
$a = "Hello"
$a
return
}
function quux {
$a = "Hello"
$a
}
Hur man arbetar med funktioner returnerar
En funktion returnerar allt som inte fångas av något annat.
Om u använder retur nyckelordet kommer varje uttalande efter returledningen inte utföras!
Så här:
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!"
}
Testet-Funktion
Kommer att återvända:
- Start
- Den nyligen skapade registernyckeln (det beror på att det finns några uttalanden som skapar output som du kanske inte förväntar dig)
- Ja, det fungerade!
Test-funktion-ExceptionalReturn kommer tillbaka:
- Start
- Fan, det fungerade inte!
Om du gör det så här:
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
}
Testet-Funktion
Kommer att återvända:
- Ja, det fungerade!
Test-funktion-ExceptionalReturn kommer tillbaka:
- Fan, det fungerade inte!
Med detta trick kan du styra den returnerade utskriften även om du inte är säker på vad som varje uttalande kommer att spottas ut.
Det fungerar så här
.{<Statements>} | Out-Null
den. gör följande skriptblock ingår i koden
{} markerar skriptblocket
den | Out-Null rör alla oväntade utmatningar till Out-Null (så det är borta!)
Eftersom skriptblocket ingår får det samma räckvidd som resten av funktionen.
Så du kan komma åt variabler som gjordes i skriptblocket.