テスト スクリプト:
function outer
{
[cmdletbinding(supportsshouldprocess=$true)]
param($s)
process
{
$pscmdlet.shouldprocess("outer $s", "ShouldProcess") | out-null
"" | out-file "outer $s"
inner ImplicitPassthru
inner VerbosePassthru -Verbose:$Verbose
inner WhatifPassthru -WhatIf:$WhatIf
}
}
function inner
{
[cmdletbinding(supportsshouldprocess=$true)]
param($s)
process
{
$pscmdlet.shouldprocess("inner $s", "ShouldProcess") | out-null
"" | out-file "inner $s"
}
}
"`n** NORMAL **"
outer normal
"`n** VERBOSE **"
outer verbose -Verbose
"`n** WHATIF **"
outer whatif -WhatIf
出力:
** NORMAL **
VERBOSE: Performing operation "ShouldProcess" on Target "inner VerbosePassthru".
What if: Performing operation "ShouldProcess" on Target "inner WhatifPassthru".
What if: Performing operation "Output to File" on Target "inner WhatifPassthru".
** VERBOSE **
VERBOSE: Performing operation "ShouldProcess" on Target "outer verbose".
VERBOSE: Performing operation "ShouldProcess" on Target "inner VerbosePassthru".
What if: Performing operation "ShouldProcess" on Target "inner WhatifPassthru".
What if: Performing operation "Output to File" on Target "inner WhatifPassthru".
** WHATIF **
What if: Performing operation "ShouldProcess" on Target "outer whatif".
What if: Performing operation "Output to File" on Target "outer whatif".
What if: Performing operation "ShouldProcess" on Target "inner ImplicitPassthru".
What if: Performing operation "Output to File" on Target "inner ImplicitPassthru".
What if: Performing operation "ShouldProcess" on Target "inner VerbosePassthru".
What if: Performing operation "Output to File" on Target "inner VerbosePassthru".
What if: Performing operation "ShouldProcess" on Target "inner WhatifPassthru".
What if: Performing operation "Output to File" on Target "inner WhatifPassthru".
私の目には、ここにいくつかの奇妙な点があります。
- -WhatIf:$foo を指定すると、$foo が何であれ、呼び出し先 (およびその呼び出し先) で常に$WhatIf がオンになります。
- -WhatIf を "実際に" (既存の変数に制約せずに) 指定すると、呼び出し先に暗黙的に伝達されます。パススルーやスプラッティングは必要ありません。
- -WhatIf とは異なり、明示的な -Verbose は呼び出し先に暗黙的にカスケードしません。
- -Verbose:$foo を手動でパススルーしようとすると、動作が -WhatIf:$foo に似ていることがわかります。ただし、$psCmdlet.ShouldProcess() を手動でテストするスクリプトにのみ影響します。組み込みのコマンドレットは影響を受けません。
注意: Confirm の動作は WhatIf と同じです。簡潔にするために省略しました。
Web と Connect を検索すると、高度な機能に関連する ShouldProcess の動作 (賛否両論) についての詳細な議論はほとんど見当たりません。最も近いものは、コール スタック全体で $psCmdlet の 1 つのインスタンスを渡すことを推奨するJames O'Neill の投稿です。ただし、彼はまったく別の問題を回避するためにそうします (複数の -Confirm プロンプトを回避します)。一方、各関数に提供されている標準の $psCmdlet に固執すると、何を期待するかについてのドキュメントが表示されません...デザインパターンやベストプラクティスなどははるかに少ないです...