2011-11-02 4 views
7

Próbowałem pisać bezpieczny kod, który obsługuje -highif z metodą ShouldProcess, aby moi użytkownicy mieli pojęcie o tym, co powinien wykonać cmdlet przed uruchomieniem to naprawdę.Powershell: Jak uzyskać -hatif do propagacji do cmdletów w innym module

Jednak natknąłem się na szkopuł. Jeśli wywołam skrypt z argumentem -highif jako argumentem, $ pscmdlet.ShouldProcess zwróci wartość false. Wszystko dobrze i dobrze. Jeśli wywołasz cmdlet zdefiniowany w tym samym pliku (który ma SupportsShouldProcess = $ true), zwróci również wartość false.

Jednakże, jeśli wywołuję cmdlet zdefiniowany w innym module, który załadowałem za pomocą modułu importu, to zwróci true. Kontekst -highif nie przechodzi do wywołań w drugim module.

Nie chcę ręcznie przekazywać flagi do każdego cmdletu. Czy ktoś ma lepsze rozwiązanie?

Ten problem wydaje się być związany z tym question. Nie mówią jednak o problemie z wieloma modułami.

Przykład Scenariusz:

#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 

Moduł:

#whatiftest_module.psm1 
function InnerModule 
{ 
    [CmdletBinding(SupportsShouldProcess=$true)] 
    param()  

    if($pscmdlet.ShouldProcess("InnerModule")) 
    { 
     Write-Host "InnerModule ShouldProcess" 
    } 
    else 
    { 
     Write-Host "InnerModule Should not Process" 
    } 
} 

wyjściowa:

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

Z mojego doświadczenia, nawet gdy przechodzącej przez wspólnych parametrów '-whatIf: $ whatIf -confirm: $ Potwierdź -debug: $ Debug -verbose: $ Verbose', będą one ignorowane na krzyżu -moduł granice ... –

Odpowiedz

6

Aby to zrobić, można użyć techniki nazywam "callstack wgląd". Użyj Get-PSCallStack, aby sprawdzić, co nazywa się funkcją. Każdy element będzie miał InvocationInfo, a jego wnętrze będzie własnością o nazwie "BoundParameters". Ma to parametry na każdym poziomie. Jeśli -WhatIf został przekazany do któregokolwiek z nich, możesz działać tak, jak -W tym przypadku został przekazany do twojej funkcji.

Nadzieja to pomaga

+0

Takie podejście wkrótce doprowadzi do subtelnych defektów. Co się dzieje, gdy określona jest opcja '-WhatIf' lub' -Confirm', ale funkcja w środku stosu wywołań ma logikę, która nie wymaga użycia '-WhatIf'? I szukasz wszystkich innych wspólnych parametrów, takich jak '-Verbose',' -Debug'? Co się stanie, gdy wprowadzony zostanie nowy wspólny parametr? Czy bierzesz pod uwagę globalną wartość $ ConfirmPreference? –

Powiązane problemy