Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Rövid leírás
Ismerteti, hogyan definiálhat és használhat paraméterkészleteket speciális függvényekben.
Hosszú leírás
A PowerShell paraméterkészletekkel teszi lehetővé, hogy egyetlen függvényt írjon, amely különböző műveleteket hajthat végre különböző forgatókönyvek esetén. A paraméterkészletekkel különböző paramétereket tehet elérhetővé a felhasználó számára. És a felhasználó által megadott paraméterek alapján adja vissza a különböző információkat. Egyszerre csak egy paraméterkészletet használhat.
Paraméterkészletre vonatkozó követelmények
Az alábbi követelmények az összes paraméterkészletre vonatkoznak.
Ha egy paraméterhez nincs megadva paraméterkészlet, a paraméter az összes paraméterkészlethez tartozik.
Minden paraméterkészletnek paraméterek egyedi kombinációjával kell rendelkeznie. Ha lehetséges, az egyedi paraméterek legalább egyikének kötelező paraméternek kell lennie.
Egy több pozícióparamétert tartalmazó paraméterkészletnek minden paraméterhez egyedi pozíciókat kell meghatároznia. Egyetlen két pozícióparaméter sem tudja ugyanazt a pozíciót megadni.
Jegyzet
Legfeljebb 32 paraméterkészletet lehet megadni.
Alapértelmezett paraméterkészletek
Több paraméterkészlet definiálásakor a DefaultParameterSetName attribútum kulcsszója adja meg az alapértelmezett paraméterkészletet.
A PowerShell akkor használja az alapértelmezett paraméterkészletet, ha a parancshoz megadott információk alapján nem tudja meghatározni a használni kívánt paraméterkészletet. További információ a CmdletBinding attribútumról: about_Functions_CmdletBindingAttribute.
Paraméterkészletek deklarálása
Paraméterkészlet létrehozásához meg kell adnia a ParameterSetName attribútum kulcsszóját a paraméterkészlet minden paraméteréhez. Több paraméterkészlethez tartozó paraméterek esetén minden paraméterkészlethez adjon hozzá egy Paraméter attribútumot.
A Paraméter attribútum lehetővé teszi, hogy a paramétert az egyes paraméterkészletekhez eltérően definiálja. Megadhat például egy paramétert kötelezőként az egyik készletben, a másikban pedig választhatóként. Minden paraméterkészletnek azonban tartalmaznia kell legalább egy egyedi paramétert.
Azok a paraméterek, amelyekhez nincs hozzárendelt paraméterkészlet neve, az összes paraméterkészlethez tartoznak.
Fenntartott paraméterkészlet neve
A PowerShell fenntartja a paraméterkészlet nevét __AllParameterSets a speciális kezeléshez.
__AllParameterSets az alapértelmezett paraméter neve, ha a rendszer nem használ explicit alapértelmezett nevet.
ParameterSetName A Paraméter attribútum __AllParameterSets beállítása egyenértékű azzal, hogy nem rendel hozzá .ParameterSetName Mindkét esetben a paraméter az összes paraméterkészlethez tartozik.
Jegyzet
A CmdletBinding attribútum nem akadályozza meg a beállítását.DefaultParameterSetName__AllParameterSets Ha ezt teszi, a PowerShell létrehoz egy explicit paraméterkészletet, amelyet a Paraméter attribútum nem tud megfelelően hivatkozni.
Példák
Az alábbi példafüggvény megszámolja a szövegfájlban lévő számsorokat, karaktereket és szavakat. Paraméterek használatával megadhatja a visszaadni kívánt értékeket és a mérni kívánt fájlokat. Négy paraméterkészlet van definiálva:
- Ösvény
- PathAll
- LiteralPath
- LiteralPathAll
function Measure-Lines {
[CmdletBinding(DefaultParameterSetName = 'Path')]
param (
[Parameter(Mandatory, ParameterSetName = 'Path', Position = 0)]
[Parameter(Mandatory, ParameterSetName = 'PathAll', Position = 0)]
[string[]]$Path,
[Parameter(Mandatory, ParameterSetName = 'LiteralPathAll', ValueFromPipeline)]
[Parameter(Mandatory, ParameterSetName = 'LiteralPath', ValueFromPipeline)]
[string[]]$LiteralPath,
[Parameter(ParameterSetName = 'Path')]
[Parameter(ParameterSetName = 'LiteralPath')]
[switch]$Lines,
[Parameter(ParameterSetName = 'Path')]
[Parameter(ParameterSetName = 'LiteralPath')]
[switch]$Words,
[Parameter(ParameterSetName = 'Path')]
[Parameter(ParameterSetName = 'LiteralPath')]
[switch]$Characters,
[Parameter(Mandatory, ParameterSetName = 'PathAll')]
[Parameter(Mandatory, ParameterSetName = 'LiteralPathAll')]
[switch]$All,
[Parameter(ParameterSetName = 'Path')]
[Parameter(ParameterSetName = 'PathAll')]
[switch]$Recurse
)
begin {
if ($All) {
$Lines = $Words = $Characters = $true
}
elseif (($Words -eq $false) -and ($Characters -eq $false)) {
$Lines = $true
}
}
process {
if ($Path) {
$Files = Get-ChildItem -Path $Path -Recurse:$Recurse -File
}
else {
$Files = Get-ChildItem -LiteralPath $LiteralPath -File
}
foreach ($file in $Files) {
$result = [ordered]@{ }
$result.Add('File', $file.FullName)
$content = Get-Content -LiteralPath $file.FullName
if ($Lines) { $result.Add('Lines', $content.Length) }
if ($Words) {
$wc = 0
foreach ($line in $content) { $wc += $line.Split(' ').Length }
$result.Add('Words', $wc)
}
if ($Characters) {
$cc = 0
foreach ($line in $content) { $cc += $line.Length }
$result.Add('Characters', $cc)
}
New-Object -TypeName psobject -Property $result
}
}
}
Minden paraméterkészletnek egyedi paraméterrel vagy paraméterek egyedi kombinációjával kell rendelkeznie. A Path és PathAll paraméterkészletek nagyon hasonlóak, de a Minden paraméter egyedi a PathAll paraméterkészletben. Ugyanez igaz a LiteralPath és LiteralPathAll paraméterkészletekre is. Annak ellenére, hogy a PathAll és a LiteralPathAll paraméterkészlet egyaránt All paramétert, a Path és LiteralPath paraméterek megkülönböztetik őket.
A Get-Command -Syntax az egyes paraméterkészletek szintaxisát jeleníti meg. Ez azonban nem jeleníti meg a paraméterkészlet nevét. Az alábbi példa bemutatja, hogy mely paraméterek használhatók az egyes paraméterkészletekben.
(Get-Command Measure-Lines).ParameterSets |
Select-Object -Property @{n='ParameterSetName';e={$_.Name}},
@{n='Parameters';e={$_.ToString()}}
ParameterSetName Parameters
---------------- ----------
Path [-Path] <string[]> [-Lines] [-Words] [-Characters] [-Recurse] [<CommonParameters>]
PathAll [-Path] <string[]> -All [-Recurse] [<CommonParameters>]
LiteralPath -LiteralPath <string[]> [-Lines] [-Words] [-Characters] [<CommonParameters>]
LiteralPathAll -LiteralPath <string[]> -All [<CommonParameters>]
Paraméterkészletek működés közben
A példa a PathAll paraméterkészletet használja.
Measure-Lines test* -All
File Lines Words Characters
---- ----- ----- ----------
C:\temp\test\test.help.txt 31 562 2059
C:\temp\test\test.md 30 1527 3224
C:\temp\test\test.ps1 3 3 79
C:\temp\test\test[1].txt 31 562 2059
Hiba több készlet paramétereinek használatakor
Ebben a példában különböző paraméterkészletekből származó egyedi paramétereket használunk.
Get-ChildItem -Path $PSHOME -LiteralPath $PSHOME
Get-ChildItem: Parameter set cannot be resolved using the specified named
parameters. One or more parameters issued cannot be used together or an
insufficient number of parameters were provided.
A Path és LiteralPath paraméterek egyediek a Get-ChildItem parancsmag különböző paraméterkészleteihez. Ha a paraméterek ugyanabban a parancsmagban futnak együtt, hibaüzenet jelenik meg. Parancsmag-hívásonként egyszerre csak egy paraméterkészlet használható.
Hogyan lehet tudni, hogy melyik paraméterkészletet használja a rendszer
Az automatikus változó $PSCmdlet biztosítja a ParameterSetName tulajdonságot.
Ez a tulajdonság a használt paraméterkészlet nevét tartalmazza. Ez a tulajdonság a függvényben annak meghatározására használható, hogy melyik paraméterkészletet használja a paraméterkészlet-specifikus viselkedés kiválasztásához.
function Get-ParameterSetName {
[CmdletBinding(DefaultParameterSetName = 'Set1')]
param (
[Parameter(ParameterSetName = 'Set1', Position = 0)]
$Var1,
[Parameter(ParameterSetName = 'Set2', Position = 0)]
$Var2,
[Parameter(ParameterSetName = 'Set1', Position = 1)]
[Parameter(ParameterSetName = 'Set2', Position = 1)]
$Var3,
[Parameter(Position = 2)]
$Var4
)
"Using Parameter set named '$($PSCmdlet.ParameterSetName)'"
switch ($PSCmdlet.ParameterSetName) {
'Set1' {
"`$Var1 = $Var1"
"`$Var3 = $Var3"
"`$Var4 = $Var4"
break
}
'Set2' {
"`$Var2 = $Var2"
"`$Var3 = $Var3"
"`$Var4 = $Var4"
break
}
}
}
PS> Get-ParameterSetName 1 2 3
Using Parameter set named 'Set1'
$Var1 = 1
$Var3 = 2
$Var4 = 3
PS> Get-ParameterSetName -Var2 1 2 3
Using Parameter set named 'Set2'
$Var2 = 1
$Var3 = 2
$Var4 = 3