Le funzioni di PowerShell restituiscono il comportamento
-
02-07-2019 - |
Domanda
Sto riscontrando un comportamento piuttosto strano con PowerShell, sembra che le funzioni personalizzate potrebbero aver bisogno di un "involucro parentesi" per valutare come ci si potrebbe aspettare. Data una semplice funzione di PowerShell:
function Return-True { return $true }
e poi un po 'di codice di esempio per invocarlo:
PS C:\> Return-True
True
PS C:\> Return-True -eq $false
True
PS C:\> (Return-True) -eq $false
False
Idee? Commenti?
Soluzione
Quando PowerShell vede il token Return-True
lo identifica come un comando e fino alla valutazione o alla fine dell'istruzione, tutto il resto è un argomento che viene passato alla funzione Return-True
.
Puoi vederlo in azione se lo fai:
PS > function Return-True { "The arguments are: $args"; return $true }
PS > Return-True -eq $false
The arguments are: -eq False
True
Ecco perché tutto quanto segue restituisce 'True', perché tutto ciò che vedi è il risultato della chiamata Return-True
con vari argomenti:
PS > Return-True -eq $false
True
PS > Return-True -ne $false
True
PS > Return-True -eq $true
True
PS > Return-True -ne $true
True
L'uso di (Return-True)
forza PowerShell a valutare la funzione (senza argomenti).
Altri suggerimenti
La seconda riga non sta eseguendo una valutazione booleana. Guarda cosa succede se fai la stessa cosa con le stringhe.
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 seconda riga sta semplicemente restituendo il valore della funzione e non sta facendo un confronto. Non sono sicuro del motivo per cui si sta verificando questo comportamento, ma rende il comportamento più facile da vedere rispetto all'uso di valori booleani che vengono convertiti nelle stringhe "Vero". e " False " ;.
Se usi l'editor di PowerShell V2, lo vedresti -eq nel primo esempio è blu, perché è un argomento e -eq nel secondo esempio è grigio perché è un operatore
Anche in V2, puoi essere severo riguardo agli argomenti, con 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