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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top