Dodanie -WhatIf do funkcji w dwóch krokach

By PowerShell

Myślę, że wraz z wiekiem doświadczeniem stajemy się ostrożniejsi. U mnie objawia się to chęcią wiedzy jak coś działa, podwójnym sprawdzaniem przed wykonaniem i częstszym korzystam z przełaczników -WhatIf i -Confirm w PowerShell.

-WhatIf i -Confirm to parametry ograniczania ryzyka. Należą do grupy wspólnych parametrów, jednak nie wszystkie cmdlety je oferują. Głównie będą to polecenie z grupy Set, Remove, Move, Clear.

Parametr -Confirm pyta użytkownika przed uruchomieniem polecenia dla każdego obiektu w potoku. Parametr -WhatIf wyświetla zmiany, które wprowadziłaby komenda, zamiast uruchamiać komendę.

PowerShell WhatIf and Confirm

Wspólne parametry nie są zarezerwowane tylko dla natywnych poleceń. Dobrą praktyką jest stosowanie atrybuty [cmdletbiding()] do swoich funkcji co automatycznie dodaje takie parametry jak -Verbose, -Debug -ErrorAction itd.

W przypadku przełączników ryzka samo cmdletbiding() nie wystarcza.

Jak dodać obsługę -Confirm i -WhatIf?

Prosta sprawa. Po pierwsze wraz z cmdletbiding musimy skorzystać argumentu SupportsShouldProcess tak jak poniżej, który doda dwa przełączniki.

[CmdletBinding(SupportsShouldProcess)]

Po drugie umieszczamy nasz skrypt w odpowiedniej instrukcji warunkowej, która obsłuży -Confirm i WhatIf.

if ($PSCmdlet.ShouldProcess("Target","Operation")) {
    # nasz skrypt
}

Całość wygląda tak. Zwróć uwagę na funkcję, w miejscu, gdzie znajduje się $PSCmdlet.ShouldProcess oraz na przykład wykonania

<#
 .EXAMPLE
    PS C:\> Remove-Transcript -FullName 'C:\Temp\20200326\PowerShell_transcript.IT-MN-M.2CVeQOKn.20200326085447' -WhatIf
 .EXAMPLE
    PS C:\> Remove-Transcript -FullName 'C:\Temp\20200326\PowerShell_transcript.IT-MN-M.2CVeQOKn.20200326085447' -Confirm
#>
function Remove-Transcript
{
    [cmdletbinding(SupportsShouldProcess)]
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string]$FullName
    )
    process
    {
        if ($PSCmdlet.ShouldProcess($FullName, 'Remove transcript'))
        {
            Write-Output "Usunięcie $FullName"
        }
    }
}
-WhatIf and -Confirm

Nie musimy w metodzie ShouldProcess wskazywać nazwy działania. Domyślnie wtedy zostanie wyświetlona nazwa naszej funkcji.

# fragment..
if ($PSCmdlet.ShouldProcess($FullName, 'Remove transcript'))
PowerShell Common Parameters

Podsumowanie

Warto stosować ale i też i dodawać obsługę -Confirm i -WhatIf do swoich funkcji. Mimo wszystko należy mieć z tyłu głowy, że parametry te nie niwelują ryzyka lecz ograniczają.

Szczególną uwagę zwróć na kod PowerShella pobierany z sieci, który może wykonywać kompletnie coś innego niż oczekiwaliśmy. Niezależnie czy posiada -WhatIf czy -Confirm.

💡 Jak dodać -WhatIf i -Confirm do funkcji PowerShell? Dwa kroki
1️⃣ dodaj [CmdletBinding(SupportsShouldProcess)]
2️⃣ umieść swój kod PowerShell w instrukcji warunkowej if($PSCmdlet.ShouldProcess('Target')) {}

function Nazwa-Funkcji
{
    [cmdletbinding(SupportsShouldProcess)]
    param(
        # Parametry
    )
    process
    {
        if ($PSCmdlet.ShouldProcess('Target'))
        {
            # tutaj skrypt
        }
    }
}

22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

No comments yet.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

× Close