2008-09-29 30 views
17

Veo un comportamiento algo extraño con PowerShell, parece que las funciones personalizadas pueden necesitar un "contenedor de paréntesis" para evaluarlo como podría esperar. Teniendo en cuenta una simple función de PowerShell:Funciones de devolución de las funciones de PowerShell

function Return-True { return $true } 

y luego un código de ejemplo para alegar ésta:

PS C:\> Return-True 
True 
PS C:\> Return-True -eq $false 
True 
PS C:\> (Return-True) -eq $false 
False 

ideas? ¿Comentarios?

Respuesta

34

Cuando PowerShell ve el token Return-True lo identifica como un comando y hasta la evaluación o el final de la instrucción, todo lo demás es un argumento que se pasa a la función Return-True.

Se puede ver esto en acción si lo hace:

PS > function Return-True { "The arguments are: $args"; return $true } 
PS > Return-True -eq $false 
The arguments are: -eq False 
True 

Es por eso que todos los siguientes retorno 'True', porque todo lo que está viendo es el resultado de llamar Return-True con varios argumentos:

PS > Return-True -eq $false 
True 
PS > Return-True -ne $false 
True 
PS > Return-True -eq $true 
True 
PS > Return-True -ne $true 
True 

El uso de (Return-True) obliga a PowerShell a evaluar la función (sin argumentos).

5

La segunda línea no está haciendo una evaluación booleana. Mira lo que sucede si haces lo mismo con cuerdas.

PS C:\> function Return-True { return "True string" } 
PS C:\> Return-True 
True string 
PS C:\> Return-True -eq "False string" 
True string 
PS C:\> (Return-True) -eq "False string" 
False 

La segunda línea simplemente devuelve el valor de la función y no hace una comparación. No estoy seguro de por qué está ocurriendo este comportamiento, pero hace que el comportamiento sea más fácil de ver que cuando se usan valores booleanos que se están convirtiendo en las cadenas "Verdadero" y "Falso".

4

Si utiliza el editor de PowerShell V2, se vería que -eq en el primer ejemplo es el azul, porque es un argumento y eq en el segundo ejemplo es gris porque es un operador

también en V2, puede ser estricto con los argumentos, con CmdletBinding y param

function Return-True 
{ 
    [CmdletBinding()] 
    param() 
    return $true 
} 
Return-True -eq $false 

Return-True -eq $false 
Return-True : A parameter cannot be found that matches parameter name 'eq'. 
At line:7 char:16 
+ Return-True -eq <<<< $false 
    + CategoryInfo   : InvalidArgument: (:) [Return-True], ParameterBindingException 
    + FullyQualifiedErrorId : NamedParameterNotFound,Return-True 
+0

No sabía acerca de CmdletBinding, gracias – neontapir

Cuestiones relacionadas