I've been trying write safe code that supports -whatif with the ShouldProcess method so my users have an idea of what a cmdlet is supposed to do before they run it for real.
However I’ve run into a bit of a snag. If I call a script with -whatif as an argument, $pscmdlet.ShouldProcess will return false. All well and good. If I call a cmdlet defined in the same file (that has SupportsShouldProcess=$true) it will return false as well.
However, if I am calling a cmdlet defined in another module I have loaded using Import-Module, it will return true. The -whatif context does not seem to get passed through to calls in the other module.
I don't want to have to manually pass in a flag to every cmdlet. Does anyone have a better solution?
This issue seems related to this question. However, they are not talking about the cross-module problem.
Example Script:
#whatiftest.ps1 [CmdletBinding(SupportsShouldProcess=$true)] param() Import-Module -name .\whatiftest_module -Force function Outer { [CmdletBinding(SupportsShouldProcess=$true)] param() if( $pscmdlet.ShouldProcess("Outer")) { Write-Host "Outer ShouldProcess" } else { Write-Host "Outer Should not Process" } Write-Host "Calling Inner" Inner Write-Host "Calling InnerModule" InnerModule } function Inner { [CmdletBinding(SupportsShouldProcess=$true)] param() if( $pscmdlet.ShouldProcess("Inner")) { Write-Host "Inner ShouldProcess" } else { Write-Host "Inner Should not Process" } } Write-Host "--Normal--" Outer Write-Host "--WhatIf--" Outer -WhatIf
The Module:
#whatiftest_module.psm1 function InnerModule { [CmdletBinding(SupportsShouldProcess=$true)] param() if( $pscmdlet.ShouldProcess("InnerModule")) { Write-Host "InnerModule ShouldProcess" } else { Write-Host "InnerModule Should not Process" } }
Output:
F:\temp> .\whatiftest.ps1 --Normal-- Outer ShouldProcess Calling Inner Inner ShouldProcess Calling InnerModule InnerModule ShouldProcess --WhatIf-- What if: Performing operation "Outer" on Target "Outer". Outer Should not Process Calling Inner What if: Performing operation "Inner" on Target "Inner". Inner Should not Process Calling InnerModule InnerModule ShouldProcess