Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Krátký popis
Popisuje, jak definovat a používat sady parametrů v pokročilých funkcích.
Dlouhý popis
PowerShell používá sady parametrů, které umožňují napsat jednu funkci, která může provádět různé akce pro různé scénáře. Sady parametrů umožňují uživateli zpřístupnit různé parametry. A pokud chcete vrátit různé informace na základě parametrů určených uživatelem. Najednou můžete použít pouze jednu sadu parametrů.
Požadavky na sadu parametrů
Následující požadavky platí pro všechny sady parametrů.
Pokud pro parametr není zadána žádná sada parametrů, patří parametr do všech sad parametrů.
Každá sada parametrů musí mít jedinečnou kombinaci parametrů. Pokud je to možné, měl by být alespoň jeden z jedinečných parametrů povinným parametrem.
Sada parametrů, která obsahuje více pozičních parametrů, musí definovat jedinečné pozice pro každý parametr. Žádné dva poziční parametry nemohou určit stejnou pozici.
Pouze jeden parametr v sadě může deklarovat
ValueFromPipeline
klíčové slovo s hodnotoutrue
. Více parametrů může definovatValueFromPipelineByPropertyName
klíčové slovo s hodnotoutrue
.
Poznámka:
Existuje limit 32 sad parametrů.
Výchozí sady parametrů
Pokud je definováno více sad parametrů, DefaultParameterSetName
klíčové slovo atributu CmdletBinding určuje výchozí sadu parametrů.
PowerShell používá výchozí sadu parametrů, když nemůže určit sadu parametrů, která se má použít na základě informací zadaných příkazu. Další informace o atributu CmdletBinding najdete v tématu about_Functions_CmdletBindingAttribute.
Deklarace sad parametrů
Chcete-li vytvořit sadu parametrů, je nutné zadat ParameterSetName
klíčové slovo atributu Parametr pro každý parametr v sadě parametrů. Pro parametry, které patří do více sad parametrů, přidejte atribut Parameter pro každou sadu parametrů.
Atribut Parameter umožňuje definovat parametr odlišně pro každou sadu parametrů. Parametr můžete například definovat jako povinný v jedné sadě a volitelně v jiné sadě. Každá sada parametrů však musí obsahovat alespoň jeden jedinečný parametr.
Parametry, které nemají přiřazený název sady parametrů, patří do všech sad parametrů.
Příklady
Následující ukázková funkce spočítá číselné řádky, znaky a slova v textovém souboru. Pomocí parametrů můžete určit, které hodnoty chcete vrátit a které soubory chcete měřit. Jsou definovány čtyři sady parametrů:
- Cesta
- PathAll
- LiterálPath
- 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
}
}
}
Každá sada parametrů musí mít jedinečný parametr nebo jedinečnou kombinaci parametrů.
Path
Sady PathAll
parametrů jsou velmi podobné, ale parametr All je jedinečný pro PathAll
sadu parametrů. Totéž platí u LiteralPath
sad parametrů a LiteralPathAll
parametrů. I když obě PathAll
sady parametrů LiteralPathAll
mají parametr All , parametry Path a LiteralPath je odlišují.
Použití Get-Command -Syntax
ukazuje syntaxi každé sady parametrů. Nezobrazuje se ale název sady parametrů. Následující příklad ukazuje, které parametry lze použít v každé sadě parametrů.
(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>]
Sady parametrů v akci
V příkladu PathAll
se používá sada parametrů.
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
Chyba při používání parametrů z více sad
V tomto příkladu se používají jedinečné parametry z různých sad parametrů.
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.
Parametry Path a LiteralPath jsou jedinečné pro různé sady parametrů rutiny Get-ChildItem
. Když se parametry spustí společně ve stejné rutině, vyvolá se chyba. Na volání rutiny lze současně použít pouze jednu sadu parametrů.
Jak zjistit, která sada parametrů se používá
Automatická proměnná $PSCmdlet
poskytuje vlastnost ParameterSetName .
Tato vlastnost obsahuje název používané sady parametrů. Tuto vlastnost můžete použít ve své funkci k určení, která sada parametrů se používá k výběru chování specifického pro sadu parametrů.
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