PowerShell
Comportamiento de retorno en PowerShell
Buscar..
Introducción
Se puede utilizar para salir del ámbito actual, que puede ser una función, un script o un bloque de script. En PowerShell, el resultado de cada declaración se devuelve como resultado, incluso sin una palabra clave de retorno explícita o para indicar que se ha llegado al final del alcance.
Observaciones
Puede leer más sobre la semántica de retorno en la página about_Return en TechNet, o invocando la get-help return
desde un indicador de PowerShell.
Pregunta (s) de preguntas y respuestas notables con más ejemplos / explicación:
- Valor de retorno de la función en PowerShell
- PowerShell: la función no tiene un valor de retorno adecuado
about_return en MSDN lo explica de manera sucinta:
La palabra clave Return sale de una función, script o bloque de script. Se puede usar para salir de un alcance en un punto específico, para devolver un valor o para indicar que se ha llegado al final del alcance.
Los usuarios que están familiarizados con lenguajes como C o C # pueden querer usar la palabra clave Return para hacer que la lógica de dejar un alcance explícito.
En Windows PowerShell, los resultados de cada declaración se devuelven como resultados, incluso sin una declaración que contenga la palabra clave Return. Los idiomas como C o C # devuelven solo el valor o los valores especificados por la palabra clave Return.
Salida temprana
function earlyexit {
"Hello"
return
"World"
}
"Hola" se colocará en el canal de salida, "Mundo" no
Gotcha! Retorno en la tubería
get-childitem | foreach-object { if ($_.IsReadOnly) { return } }
Los cmdlets de ForEach-Object
(por ejemplo, ForEach-Object
, Where-Object
, etc.) operan en los cierres. La devolución aquí solo se moverá al siguiente elemento en la canalización, no al proceso de salida. Puede usar break en lugar de return si desea salir del proceso.
get-childitem | foreach-object { if ($_.IsReadOnly) { break } }
Gotcha! Ignorar la salida no deseada
Inspirado por
function bar {
[System.Collections.ArrayList]$MyVariable = @()
$MyVariable.Add("a") | Out-Null
$MyVariable.Add("b") | Out-Null
$MyVariable
}
Out-Null
es necesario porque el método .NET ArrayList.Add
devuelve el número de elementos en la colección después de agregarlos. Si se omite, la tubería habría contenido 1, 2, "a", "b"
Hay varias formas de omitir resultados no deseados:
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"
}
Nota: para obtener más información sobre por qué preferir > $null
, consulte [tema aún no creado].
Vuelve con un valor
(Parafraseado de about_return )
Los siguientes métodos tendrán los mismos valores en la tubería.
function foo {
$a = "Hello"
return $a
}
function bar {
$a = "Hello"
$a
return
}
function quux {
$a = "Hello"
$a
}
Cómo trabajar con funciones devoluciones.
Una función devuelve todo lo que no es capturado por otra cosa.
Si u utilizar la palabra clave de retorno, no se ejecutará cada declaración después de la línea de retorno!
Me gusta esto:
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!"
}
Función de prueba
Volverá
- comienzo
- La clave de registro recién creada (esto se debe a que hay algunas declaraciones que crean resultados que puede no estar esperando)
- Sí, funcionó!
Test-Function -ExceptionalReturn devolverá:
- comienzo
- Maldita sea, no funcionó!
Si lo haces así:
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
}
Función de prueba
Volverá
- Sí, funcionó!
Test-Function -ExceptionalReturn devolverá:
- Maldita sea, no funcionó!
Con este truco, puede controlar el resultado devuelto incluso si no está seguro de lo que escupirá cada declaración.
Funciona así
.{<Statements>} | Out-Null
la . realiza el siguiente bloque de script incluido en el código
el {} marca el bloque de script
el | Out-Null canaliza cualquier salida inesperada a Out-Null (¡así que se ha ido!)
Debido a que el bloque de secuencias de comandos está incluido, obtiene el mismo ámbito que el resto de la función.
Así que puedes acceder a las variables que fueron creadas dentro del bloque de script.