I have a PowerShell script cmdlet that supports the -WhatIf
& -Confirm
parameters.
It does this by calling the $PSCmdlet.ShouldProcess()
method before performing the change.
This works as expected.
The problem I have is that my Cmdlet is implemented by calling other Cmdlets and the -WhatIf
or -Confirm
parameters are not passed along to the Cmdlets I invoke.
How can I pass along the values of -WhatIf
and -Confirm
to the Cmdlets I call from my Cmdlet?
For example, if my Cmdlet is Stop-CompanyXyzServices
and it uses Stop-Service
to implement its action.
If -WhatIf
is passed to Stop-CompanyXyzServices
I want it to also be passed to Stop-Service.
Is this possible?
Passing parameters explicitly
You can pass the -WhatIf
and -Confirm
parameters with the $WhatIfPreference
and $ConfirmPreference
variables. The following example achieves this with parameter splatting:
if($ConfirmPreference -eq 'Low') {$conf = @{Confirm = $true}}
StopService MyService -WhatIf:([bool]$WhatIfPreference.IsPresent) @conf
$WhatIfPreference.IsPresent
will be True
if the -WhatIf
switch is used on the containing function. Using the -Confirm
switch on the containing function temporarily sets $ConfirmPreference
to low
.
Passing parameters implicitly
Since the -Confirm
and -WhatIf
temporarily set the $ConfirmPreference
and $WhatIfPreference
variables automatically, is it even necessary to pass them?
Consider the example:
function ShouldTestCallee {
[cmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='Medium')]
param($test)
$PSCmdlet.ShouldProcess($env:COMPUTERNAME,"Confirm?")
}
function ShouldTestCaller {
[cmdletBinding(SupportsShouldProcess=$true)]
param($test)
ShouldTestCallee
}
$ConfirmPreference = 'High'
ShouldTestCaller
ShouldTestCaller -Confirm
ShouldTestCaller
results in True
from ShouldProcess()
ShouldTestCaller -Confirm
results in an confirm prompt even though I didn't pass the switch.
Edit
@manojlds answer made me realize that my solution was always setting $ConfirmPreference
to 'Low' or 'High'. I have updated my code to only set the -Confirm
switch if the confirm preference is 'Low'.