質問

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

アイデア?コメント?

役に立ちましたか?

解決

PowerShellは、トークン Return-True をコマンドとして認識し、評価またはステートメントの終了までトークンを識別します。それ以外はすべて、関数 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で関数を(引数なしで)強制的に評価します。

他のヒント

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」」。

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top