2

次の関数を検討してください。

function f1{
    param(
        $sb = {},
        $s  = ''
    )
    if ($sb -isnot [scriptblock]) { 'scriptblock' }
    if ($s  -isnot [string]     ) { 'string' }
}

次に、splat パラメータを使用して呼び出します。

PS C:\> $splat = @{foo='bar'}
PS C:\> f1 @splat

予想通り、何も返されません。$nullでは、 splat パラメーターを使用してもう一度試してください。

PS C:\> $splat = $null
PS C:\> f1 @splat
scriptblock

奇妙なことに、scriptblock返されます。明らかに、少なくとも[scriptblock]パラメーターについては、splat パラメーターが使用されている場合、powershell はデフォルト値を尊重していません$null。ただし、powershell は .xml のデフォルト値を尊重します[string]。ここで何が起こっているのですか?

$null splat パラメーターを使用する場合、Powershell はどの型に対してデフォルト値を尊重しますか?

4

4 に答える 4

1

何が起こっているのかを理解するのに役立つデモンストレーションを次に示します

$splat = @{foo='bar'}
"$(&{$args}@splat)"
-foo: bar

ハッシュ テーブルをスプラットすると、関数のパラメーターとなる -Key: Value 文字列のペアに変換されます。

今試してみてください:

$splat = $null
"$(&{$args}@splat)"

何も返されません。パラメータ文字列を生成するためのキーがないため、最終結果はパラメータをまったく渡さないのと同じです。

于 2015-03-17T02:23:41.393 に答える