Pergunta

Eu estou vendo algum comportamento bastante estranho com PowerShell, ele se parece com funções personalizadas podem precisar de um "wrapper parênteses" para avaliar como você poderia esperar-los. Dada uma função simples PowerShell:

function Return-True { return $true }

e, em seguida, um código de exemplo para invocá-lo:

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

Ideias? Comentários?

Foi útil?

Solução

Quando PowerShell vê o Return-True sinal que o identifica como um comando e até a avaliação ou fim da instrução, tudo o resto é um argumento que é passado para o Return-True função.

Você pode ver isso em ação se você:

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

É por isso que todos os seguintes retorno 'True', porque tudo que você está vendo é o resultado da chamada Return-True com vários 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

Usando forças (Return-True) PowerShell para avaliar a função (sem argumentos).

Outras dicas

A segunda linha não está fazendo uma avaliação boolean. Veja o que acontece se você fizer a mesma coisa com cordas.

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

A segunda linha é simplesmente devolver o valor da função, e não fazer uma comparação. Não estou certo exatamente por que esse comportamento está acontecendo, mas torna o comportamento mais fácil ver do que quando usando valores booleanos que estão sendo convertidos para as cordas "True" e "False".

Se você usar o editor do PowerShell V2, você veria que -eq no primeiro exemplo é azul, porque é um argumento e eq no segundo exemplo é cinza, porque é um operador

Também em V2, você pode ser rigoroso sobre os argumentos, com CmdletBinding e 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top