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
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 ... –