PowerShell/02core11 min

Parametry, walidacja i [CmdletBinding()]

Skrypty probe'owe ZEUS przyjmują parametry — forest do przeskanowania, tryb -AsJson, poświadczenia. Dobrze zdefiniowane, walidowane parametry to różnica między solidnym narzędziem a kruchym skryptem. Kluczem jest [CmdletBinding()].

Blok param i typowanie

Parametry deklarujemy w bloku param(), zawsze z typem.

function Get-LsnInventory {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$Forest,

        [int]$PageSize = 1000,

        [switch]$AsJson
    )
    # ...
}

Standard ProfessNet: każda funkcja probe ma [CmdletBinding()], każdy parametr ma jawny typ. Tryb maszynowy włącza [switch]$AsJson — domyślnie wyjście jest dla człowieka, z flagą — JSON na stdout.

Co daje [CmdletBinding()]

Ta jedna linijka zamienia zwykłą funkcję w funkcję zaawansowaną: dostajesz za darmo -Verbose, -Debug, -ErrorAction i automatyczną zmienną $PSCmdlet.

function Get-LsnForest {
    [CmdletBinding()]
    param([Parameter(Mandatory)][string]$Forest)

    Write-Verbose "Łączenie z forestem $Forest"   # widoczne tylko z -Verbose
    # ...
}

Get-LsnForest -Forest corp.local -Verbose

Atrybuty walidacji

Zamiast ręcznych if-ów walidujemy parametry deklaratywnie. Błędne wejście jest odrzucane, zanim funkcja się wykona.

param(
    [Parameter(Mandatory)]
    [ValidateNotNullOrEmpty()]
    [string]$Forest,

    [ValidateRange(1, 5000)]
    [int]$PageSize = 1000,

    [ValidateSet("Forest", "Inventory", "Perf")]
    [string]$Mode = "Inventory",

    [ValidatePattern('^[a-z0-9.\-]+$')]
    [string]$Domain
)
AtrybutSprawdza
[ValidateNotNullOrEmpty()]wartość niepusta
[ValidateRange(min,max)]liczba w zakresie
[ValidateSet(...)]jedna z dozwolonych wartości
[ValidatePattern(regex)]zgodność z wzorcem
[ValidateScript({...})]dowolny warunek logiczny

Standard ProfessNet: walidujemy deklaratywnie atrybutami, nie if-ami w ciele funkcji. To krótszy kod i lepsze komunikaty błędów dla wywołującego.

Parametry z pipeline

Funkcje przyjmujące dane z pipeline oznaczamy ValueFromPipeline i przetwarzamy w bloku process.

function Test-LsnHost {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [string]$ComputerName
    )
    process {
        [pscustomobject]@{
            Host    = $ComputerName
            Online  = Test-Connection $ComputerName -Count 1 -Quiet
        }
    }
}

"dc01", "dc02" | Test-LsnHost

Wskazówka: trzy bloki funkcji zaawansowanej to begin (setup raz), process (na każdy element pipeline) i end (sprzątanie). Logikę pojedynczego elementu wkładaj do process.


[CmdletBinding()] plus typowane, walidowane parametry zamieniają skrypt w prawdziwe narzędzie z -Verbose, automatyczną walidacją i obsługą pipeline. To standardowy szkielet każdej funkcji probe w ZEUS.