Paraméterek ellenőrzése

Az első fejlett függvény példámban már láthattunk egy paraméterellenőrzést, amit egy kis szkript hajtott végre. Ez a legnagyobb tudású ellenőrzés, de ennél triviálisabb ellenőrzésekre van jóval egyszerűbb kifejezésünk is, ezek a következők:

Ellenőrző címke

Jelentése

[AllowNull()]

Megengedi a paraméternek a $null értéket.

[AllowEmptyString()]

Megengedi az üres sztring használatát.

[AllowEmptyCollection()]

Megengedi az üres gyűjtemény (tömb) megadását.

[ValidateCount(1,5)]

Csak olyan tömböt fogad el, amelynek elemszáma 1 és 5 között van.

[ValidateLength(1,10)]

Csak olyan sztringet enged meg, amely hossza 1 és 10 között van.

[ValidatePattern("\d{2}-\d{3}")]

Csak az adott regex kifejezést kielégítő szöveget enged meg.

[ValidateSet("Vasárnap", "Hétfő", "Kedd")]

Csak a megadott értékek adhatók meg (kis-nagybetű érzéketlen sztringek esetében)

Nézzünk ezekre néhány példát:

function adv-validate

{

    param(

    [Parameter(

        Mandatory = $true,

        Position = 0

    )]

    [string]

    [ValidatePattern('^\w{1,4}$')]

    $szöveg,

   

    [Parameter(Position = 1)]

    [int]

    [ValidateRange(0,3)]

    $szám = 0

    )

 

$szöveg*$szám  

}

A fenti példában a $szöveg paraméternek csak maximum 4 karakteres sztringet lehet megadni, a $szám paraméternek meg csak 0 és 3 közötti egészet. Ettől eltérő paraméter-megadásnál hibákat kapunk:

[55] PS C:\> adv-validate abc 2

abcabc

[56] PS C:\> adv-validate abcde 2

adv-validate : Cannot validate argument on parameter 'szöveg'. The argument "a

bcde" does not match the "^\w{1,4}$" pattern. Supply an argument that matches

"^\w{1,4}$" and try the command again.

At line:1 char:13

+ adv-validate <<<<  abcde 2

    + CategoryInfo          : InvalidData: (:) [adv-validate], ParameterBindi

   ngValidationException

    + FullyQualifiedErrorId : ParameterArgumentValidationError,adv-validate

 

[57] PS C:\> adv-validate abc 20

adv-validate : Cannot validate argument on parameter 'szám'. The 20 argument i

s greater than the maximum allowed range of 3. Supply an argument that is less

 than 3 and then try the command again.

At line:1 char:13

+ adv-validate <<<<  abc 20

    + CategoryInfo          : InvalidData: (:) [adv-validate], ParameterBindi

   ngValidationException

    + FullyQualifiedErrorId : ParameterArgumentValidationError,adv-validate

Megjegyzés

Ha több paramétert is ellenőriztetünk, akkor az első hibánál megszakad a futtatás, és megkapjuk a vonatkozó hibajelzést, ha további paraméterek sem felelnek meg a különböző feltételeknek, akkor azokra már nem kapjuk meg a figyelmeztetést.

Nézzünk egy példát a paraméter értékkészletének meghatározásához. Ez a függvény csak a hét napjait fogadja el paraméterként és azt adja meg, hogy az adott nap a héten mely dátumra esik:

function adv-hétnapja

{

 param(

    [string]

    [ValidateSet("Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök",

        "Péntek", "Szombat")]

    $nap

    )

$napok = [collections.arraylist] ("vasárnap", "hétfő", "kedd", "szerda",

    "csütörtök", "péntek", "szombat")

 

(get-date).adddays($napok.indexof($nap.tolower()) -

     ([int] (get-date).dayofweek))

}

És nézzük, hogyan működik egy érvényes és egy érvénytelen paraméter esetében:

[67] PS C:\> adv-hétnapja vasárnap

 

2010. január 3. 13:14:43

 

 

[68] PS C:\> adv-hétnapja valami

adv-hétnapja : Cannot validate argument on parameter 'nap'. The argument "vala

mi" does not belong to the set "Vasárnap,Hétfő,Kedd,Szerda,Csütörtök,Péntek,Sz

ombat" specified by the ValidateSet attribute. Supply an argument that is in t

he set and then try the command again.

At line:1 char:13

+ adv-hétnapja <<<<  valami

    + CategoryInfo          : InvalidData: (:) [adv-hétnapja], ParameterBindi

   ngValidationException

    + FullyQualifiedErrorId : ParameterArgumentValidationError,adv-hétnapja

Megjegyzés

Látható, hogy az összehasonlítás érzéketlen a kis-nagy betűkre, ha arra érzékeny megoldást szeretnénk, akkor használjunk szkript alapú ellenőrzést!

Ha szkriptalapú ellenőrzést végzünk, akkor nem biztos, hogy a hibajelzés kellőképpen felhasználóbarát lesz:

function CsakPozitívSzám {

param(

    [double][validatescript({$_ -gt 0})]$szám

)

    "Ez egy pozitív szám: $szám"

}

Ha ezt futtatom:

PS C:\> CsakPozitívSzám -1

CsakPozitívSzám : Cannot validate argument on parameter 'szám'. The "$_ -gt 0"

 validation script for the argument with value "-1" did not return a result of

 True. Determine why the validation script failed, and then try the command ag

ain.

At line:1 char:17

+ CsakPozitívSzám -1

+                 ~~

    + CategoryInfo          : InvalidData: (:) [CsakPozitívSzám], ParameterBi

   ndingValidationException

    + FullyQualifiedErrorId : ParameterArgumentValidationError,CsakPozitívSzá

   m

Ez bizony nem túl sokatmondó egy PowerShell-hez nem értő számára. Hogyan lehetne ezt barátságosabbá tenni? Csináljunk az ellenőrző szkriptből egy függvényt értelmes névvel:

function OnlyPositiveNumberAccepted{

    $_ -gt 0

}

 

function CsakPozitívSzám {

param(

    [double][validatescript({OnlyPositiveNumberAccepted})]$szám

)

    "Ez egy pozitív szám: $szám"

}

Nézzük ekkor milyen hibát kapunk:

PS C:\> CsakPozitívSzám -1

CsakPozitívSzám : Cannot validate argument on parameter 'szám'. The "OnlyPosit

iveNumberAccepted" validation script for the argument with value "-1" did not

return a result of True. Determine why the validation script failed, and then

try the command again.

At line:1 char:17

+ CsakPozitívSzám -1

+                 ~~

    + CategoryInfo          : InvalidData: (:) [CsakPozitívSzám], ParameterBi

   ndingValidationException

    + FullyQualifiedErrorId : ParameterArgumentValidationError,CsakPozitívSzá

   m

Itt már a hibajelzés talán egy kicsit érthetőbb még azok számára is, akik nem tudják, hogy mi az a $_.

Megjegyzés

Ez a megoldás ráadásul arra is jó, hogy egy helyen definiáljuk az egyedi ellenőrzési szabályainkat, melyeket aztán több paraméternél is alkalmazhatunk. Ha módosítanunk kell a szabályt, akkor azt csak egy helyen kell megtennünk.

Ellenőrzési szabályok rendelése változókhoz

A PowerShell 3.0 verziótól kezdve ellenőrzési szabályokat nem csak paraméterekhez, hanem változókhoz is rendelhetünk. Például, ha olyan változóra van szükségünk, ami csak pozitív egészeket tartalmazhat, akkor ezt így definiálhatjuk:

PS C:\> [int][ValidateScript({$_ -gt 0})] $pozitívegész = 1

Ezek után, ha negatív számot akarunk betölteni a $pozitívegész változóba, ezt a hibát kapjuk:

PS C:\> $pozitívegész = -1

The variable cannot be validated because the value -1 is not a valid value for

 the pozitívegész variable.

At line:1 char:1

+ $pozitívegész = -1

+ ~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : MetadataError: (:) [], ValidationMetadataExcept

   ion

    + FullyQualifiedErrorId : ValidateSetFailure



Word To HTML Converter