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