デフォルトでは、[CmdletBinding()] 属性を持つ名前付き関数は、-debug
and -verbose
(および他のいくつかの) パラメータを受け入れ、定義済みの$debug
and$verbose
変数を持ちます。関数内で呼び出される他のコマンドレットにそれらを渡す方法を見つけようとしています。
次のようなコマンドレットがあるとします。
function DoStuff() {
[CmdletBinding()]
PROCESS {
new-item Test -type Directory
}
}
-debug
または が-verbose
関数に渡された場合、そのフラグをnew-item
コマンドレットに渡したいと思います。これを行うための適切なパターンは何ですか?
ベストアンサー1
$PSBoundParameters
は、あなたが探しているものではありません。[CmdletBinding()]
属性を使用すると、スクリプト内で を使用でき$PSCmdlet
、さらに Verbose フラグも提供されます。実際に使用する必要があるのは、この同じ Verbose です。
を通じて[CmdletBinding()]
、 を介してバインドされたパラメータにアクセスできます$PSCmdlet.MyInvocation.BoundParameters
。以下は、CmdletBinding を使用し、関数スコープ内で使用可能な変数を調べるために、ネストされたプロンプトをすぐに入力する関数です。
PS D:\> function hi { [CmdletBinding()]param([string] $Salutation) $host.EnterNestedPrompt() }; hi -Salutation Yo -Verbose
PS D:\>>> $PSBoundParameters
____________________________________________________________________________________________________
PS D:\>>> $PSCmdlet.MyInvocation.BoundParameters
Key Value
--- -----
Salutation Yo
Verbose True
したがって、あなたの例では、次のようになります。
function DoStuff `
{
[CmdletBinding()]
param ()
process
{
new-item Test -type Directory `
-Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true)
}
}
これには、-Verbose、-Verbose:$false、-Verbose:$true、およびスイッチがまったく存在しないケースが含まれます。