about_Parameter_Sets
Breve descrição
Descreve como definir e usar conjuntos de parâmetros em funções avançadas.
Descrição longa
O PowerShell usa conjuntos de parâmetros para permitir que você escreva uma única função que pode executar ações diferentes para diferentes cenários. Os conjuntos de parâmetros permitem que você exponha parâmetros diferentes para o usuário. E, para retornar informações diferentes com base nos parâmetros especificados pelo usuário. Você só pode usar um conjunto de parâmetros de cada vez.
Requisitos do conjunto de parâmetros
Os seguintes requisitos aplicam-se a todos os conjuntos de parâmetros.
Se nenhum conjunto de parâmetros for especificado para um parâmetro, o parâmetro pertencerá a todos os conjuntos de parâmetros.
Cada conjunto de parâmetros deve ter uma combinação única de parâmetros. Se possível, pelo menos um dos parâmetros únicos deve ser um parâmetro obrigatório.
Um conjunto de parâmetros que contém vários parâmetros posicionais deve definir posições exclusivas para cada parâmetro. Não há dois parâmetros posicionais que possam especificar a mesma posição.
Apenas um parâmetro em um conjunto pode declarar a
ValueFromPipeline
palavra-chave com um valor detrue
. Vários parâmetros podem definir aValueFromPipelineByPropertyName
palavra-chave com um valor detrue
.
Nota
Há um limite de 32 conjuntos de parâmetros.
Conjuntos de parâmetros padrão
Quando vários conjuntos de parâmetros são definidos, a DefaultParameterSetName
palavra-chave do atributo CmdletBinding especifica o conjunto de parâmetros padrão.
O PowerShell usa o conjunto de parâmetros padrão quando não pode determinar o conjunto de parâmetros a ser usado com base nas informações fornecidas ao comando. Para obter mais informações sobre o atributo CmdletBinding , consulte about_Functions_CmdletBindingAttribute.
Declarando conjuntos de parâmetros
Para criar um conjunto de parâmetros, você deve especificar a ParameterSetName
palavra-chave do atributo Parameter para cada parâmetro no conjunto de parâmetros. Para parâmetros que pertencem a vários conjuntos de parâmetros, adicione um atributo Parameter para cada conjunto de parâmetros.
O atributo Parameter permite definir o parâmetro de forma diferente para cada conjunto de parâmetros. Por exemplo, você pode definir um parâmetro como obrigatório em um conjunto e opcional em outro. No entanto, cada conjunto de parâmetros deve conter pelo menos um parâmetro exclusivo.
Os parâmetros que não têm um nome de conjunto de parâmetros atribuído pertencem a todos os conjuntos de parâmetros.
Exemplos
A função de exemplo a seguir conta as linhas numéricas, caracteres e palavras em um arquivo de texto. Usando parâmetros, você pode especificar quais valores deseja retornar e quais arquivos deseja medir. Existem quatro conjuntos de parâmetros definidos:
- Caminho
- CaminhoTudo
- Caminho Literal
- 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
}
}
}
Cada conjunto de parâmetros deve ter um parâmetro exclusivo ou uma combinação única de parâmetros. Os Path
conjuntos de parâmetros e PathAll
são muito semelhantes, mas o parâmetro All é exclusivo para o conjunto de PathAll
parâmetros. O mesmo acontece com os LiteralPath
conjuntos de parâmetros e LiteralPathAll
. Embora os PathAll
conjuntos de parâmetros e LiteralPathAll
tenham o parâmetro All , os parâmetros Path e LiteralPath os diferenciam.
Usar Get-Command -Syntax
mostra a sintaxe de cada conjunto de parâmetros. No entanto, ele não mostra o nome do conjunto de parâmetros. O exemplo a seguir mostra quais parâmetros podem ser usados em cada conjunto de parâmetros.
(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>]
Conjuntos de parâmetros em ação
O exemplo usa o conjunto de PathAll
parâmetros.
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
Erro ao usar parâmetros de vários conjuntos
Neste exemplo, parâmetros exclusivos de diferentes conjuntos de parâmetros são usados.
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.
Os parâmetros Path e LiteralPath são exclusivos para diferentes conjuntos de parâmetros do Get-ChildItem
cmdlet. Quando os parâmetros são executados juntos no mesmo cmdlet, um erro é gerado. Apenas um conjunto de parâmetros pode ser usado por chamada de cmdlet de cada vez.
Como saber qual conjunto de parâmetros é usado
A variável $PSCmdlet
automática fornece a propriedade ParameterSetName .
Esta propriedade contém o nome do conjunto de parâmetros que está sendo usado. Você pode usar essa propriedade em sua função para determinar qual conjunto de parâmetros está sendo usado para selecionar o comportamento específico do conjunto de parâmetros.
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