17

PowerShell でかなり奇妙な動作が見られます。カスタム関数を期待どおりに評価するには、「括弧ラッパー」が必要なようです。単純な PowerShell 関数が与えられた場合:

function Return-True { return $true }

そして、それを呼び出すためのサンプルコード:

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

アイデア?コメント?

4

3 に答える 3

35

PowerShell がトークンReturn-Trueを確認すると、それをコマンドとして識別し、ステートメントの評価または終了まで、それ以外はすべて function に渡される引数ですReturn-True

次のようにすれば、これを実際に見ることができます。

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

これが、次のすべてが「True」を返す理由です。表示されているのは、Return-Trueさまざまな引数で呼び出した結果だけだからです。

PS > Return-True -eq $false
True
PS > Return-True -ne $false
True
PS > Return-True -eq $true
True
PS > Return-True -ne $true
True

を使用(Return-True)すると、PowerShell は強制的に関数を評価します (引数なし)。

于 2008-09-29T16:03:28.703 に答える
5

2 行目はブール値の評価を行っていません。同じことを文字列で行うとどうなるか見てみましょう。

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

2 行目は単に関数の値を返しているだけで、比較は行っていません。この動作がなぜ起こっているのか正確にはわかりませんが、文字列「True」と「False」に変換されているブール値を使用する場合よりも動作が見やすくなります。

于 2008-09-29T16:03:13.477 に答える
4

PowerShell V2 のエディターを使用すると、最初の例の -eq は引数であるため青色で表示され、2 番目の例の -eq は演算子であるため灰色で表示されます。

また、V2 では、CmdletBinding と 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
于 2009-06-05T19:09:32.803 に答える