2011-11-02 12 views
7

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 
+0

Nella mia esperienza, anche quando passa attraverso i parametri comuni '-WhatIf: $ WhatIf -Confirm: $ Confermare -Debug: $ Debug -Verbose: $ Verbose', saranno ignorate sulla croce -module boundaries ... –

risposta

6

Per fare questo, è possibile utilizzare una tecnica che io chiamo "CallStack sbirciare". Usa Get-PSCallStack per cercare qualunque cosa abbia chiamato la funzione. Ogni oggetto avrà un InvocationInfo e un interno di esso sarà una proprietà chiamata "BoundParameters". Questo ha i parametri @ ogni livello. Se -What If è stato passato a qualcuno di loro, puoi agire come -WhatIf è stato passato alla tua funzione.

Spero che questo aiuti

+0

Questo approccio porterà presto a sottili difetti. Cosa succede quando '-WhatIf' o' -Confirm' è specificato, ma una funzione nel mezzo dello stack di chiamate ha una logica che richiede di non usare '-WhatIf'? E cerchi tutti gli altri parametri comuni, come '-Verbose',' -Debug'? Cosa succede quando viene introdotto un nuovo parametro comune? Prendi in considerazione il valore globale $ ConfirmPreference? –

Problemi correlati