Pregunta

Estoy viendo un comportamiento bastante extraño con PowerShell, parece que las funciones personalizadas pueden necesitar un " envoltura de paréntesis " para evaluar como se puede esperar de ellos. Dada una función simple de PowerShell:

function Return-True { return $true }

y luego un código de ejemplo para invocarlo:

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

Ideas? ¿Comentarios?

¿Fue útil?

Solución

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

Puedes ver esto en acción si lo haces:

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 todo lo siguiente devuelve 'Verdadero', porque todo lo que está viendo es el resultado de llamar a 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).

Otros consejos

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

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 exactamente de por qué ocurre 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 " ;.

Si usa el editor de PowerShell V2, verá que -eq en el primer ejemplo es 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top