PowerShell comportamento funções de retorno
-
02-07-2019 - |
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?
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