Ho provato codice di scrittura sicuro che supporta -whatif con il metodo ShouldProcess in modo che i miei utenti abbiano un'idea di cosa deve fare un cmdlet prima di eseguire è vero.PowerShell: come ottenere -whatif per propagare ai cmdlet in un altro modulo
Tuttavia ho incontrato un po 'di intoppo. Se chiamo uno script con -whatif come argomento, $ pscmdlet.ShouldProcess restituirà false. Tutto bene. Se chiamo un cmdlet definito nello stesso file (che SupportsShouldProcess = $ true) restituirà anche false.
Tuttavia, se sto chiamando un cmdlet definito in un altro modulo che ho caricato utilizzando Import-Module, restituirà true. Il contesto -whatif non sembra essere passato attraverso le chiamate nell'altro modulo.
Non voglio dover passare manualmente un flag a ogni cmdlet. Qualcuno ha una soluzione migliore?
Questo problema sembra correlato a questo question. Tuttavia, non stanno parlando del problema dei cross-module.
Esempio 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
Il modulo:
#whatiftest_module.psm1
function InnerModule
{
[CmdletBinding(SupportsShouldProcess=$true)]
param()
if($pscmdlet.ShouldProcess("InnerModule"))
{
Write-Host "InnerModule ShouldProcess"
}
else
{
Write-Host "InnerModule Should not Process"
}
}
uscita:
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
Nella mia esperienza, anche quando passa attraverso i parametri comuni '-WhatIf: $ WhatIf -Confirm: $ Confermare -Debug: $ Debug -Verbose: $ Verbose', saranno ignorate sulla croce -module boundaries ... –