3

を使用して検証されたオプションのパラメーターを受け取る PowerShell 関数があり、ValidateSetAttributeその値に基づいて別の動的パラメーターを追加します。ただし、厳密モードでは、ブロック内のパラメーターにアクセスしようとすると、そのパラメーターをDynamicParam明示的に設定していないと、変数が定義されていないというエラーが発生します。

Param(
    [Parameter()]
    [ValidateSet('A', 'B')]
    [string] $Target = 'A'
)
DynamicParam {
    if ($Target -eq 'B') { # <- Here it fails
        # Add new parameter here...
    }
}
end {
    Write-Host $Target
}

スクリプトは、AまたはBを最初のパラメーターとして呼び出すと機能しますが、パラメーターを省略すると失敗します。興味深いことに、パラメーター定義からParameterAttributeまたはを削除すると、機能します。ValidateSetAttribute

私の現在の回避策は、次のように、を使用して変数にアクセスし$PSBoundParameters、パラメーターが設定されているかどうかを確認することです。

if ($PSBoundParameters.ContainsKey('Target') -and $PSBoundParameters.Target -eq 'B') {
    # Add new parameter here...
}

Aこれは正常に機能しますが、代わりに値を確認したい場合は、1 つの欠点Aがあります。パラメーターの既定値$PSBoundParametersと同様に、パラメーターが省略され、既定値が適用されると、追加されません。したがって、チェックを変更して、次のことを明示的にチェックする必要があります。

if (-not $PSBoundParameters.ContainsKey('Target') -or $PSBoundParameters.Target -eq 'A')) {
    # Add new parameter here...
}

このソリューションは、動的パラメーターの追加をデフォルト値と不必要に結びつけるので、あまり好きではありません。理想的には、他に何も触れずにデフォルト値を変更できるようにしたいと考えています。DynamicParamブロック内から実際のパラメータ値にアクセスする方法はありますか? または、少なくともパラメーター定義にアクセスしてデフォルト値にアクセスする可能性はありますか?

4

1 に答える 1

5

がモード ( ) でPSDebug実行されている場合に正しく実行する必要がある場合は、次のようにすることができます。strictset-psdebug -strict

Param(
    [Parameter()]
    [ValidateSet('A', 'B')]
    [string] $Target = 'A'
)

DynamicParam {

    # Ensure $Target is defined
    try { [void]$Target }
    catch { $Target = [string]::Empty }

    if ($Target -eq 'B') {
        write-host "si si"
    }
}
end {
    Write-Host $Target
}
于 2013-02-27T16:37:25.837 に答える