Om parameteruppsättningar
KORT BESKRIVNING
Beskriver hur du definierar och använder parameteruppsättningar i avancerade funktioner.
LÅNG BESKRIVNING
PowerShell använder parameteruppsättningar så att du kan skriva en enda funktion som kan utföra olika åtgärder för olika scenarier. Med parameteruppsättningar kan du exponera olika parametrar för användaren. Och för att returnera annan information baserat på de parametrar som anges av användaren.
Krav för parameteruppsättningar
Följande krav gäller för alla parameteruppsättningar.
Varje parameteruppsättning måste ha minst en unik parameter. Om möjligt gör du den här parametern till en obligatorisk parameter.
En parameteruppsättning som innehåller flera positionsparametrar måste definiera unika positioner för varje parameter. Inga två positionsparametrar kan ange samma position.
Endast en parameter i en uppsättning kan deklarera nyckelordet
ValueFromPipeline
med värdettrue
. Flera parametrar kan definiera nyckelordetValueFromPipelineByPropertyName
med värdettrue
.Om ingen parameteruppsättning har angetts för en parameter tillhör parametern alla parameteruppsättningar.
Anteckning
Det finns en gräns på 32 parameteruppsättningar.
Standardparameteruppsättningar
När flera parameteruppsättningar har definierats anger nyckelordet DefaultParameterSetName
för attributet CmdletBinding standardparameteruppsättningen.
PowerShell använder standardparameteruppsättningen när den inte kan fastställa vilken parameteruppsättning som ska användas baserat på den information som tillhandahålls till kommandot. Mer information om attributet CmdletBinding finns i about_functions_cmdletbindingattribute.
Deklarera parameteruppsättningar
Om du vill skapa en parameteruppsättning måste du ange nyckelordet ParameterSetName
för parameterattributet för varje parameter i parameteruppsättningen. För parametrar som tillhör flera parameteruppsättningar lägger du till ett parameterattribut för varje parameteruppsättning.
Med parameterattributet kan du definiera parametern på olika sätt för varje parameteruppsättning. Du kan till exempel definiera en parameter som obligatorisk i en uppsättning och valfri i en annan. Varje parameteruppsättning måste dock innehålla minst en unik parameter.
Parametrar som inte har ett tilldelat parameteruppsättningsnamn tillhör alla parameteruppsättningar.
Exempel
Följande exempelfunktion räknar antalet rader, tecken och ord i en textfil. Med hjälp av parametrar kan du ange vilka värden du vill returnera och vilka filer du vill mäta. Det finns fyra definierade parameteruppsättningar:
- Sökväg
- PathAll
- LiteralPath
- LiteralPathAll
function Measure-Lines {
[CmdletBinding(DefaultParameterSetName = 'Path')]
param (
[Parameter(Mandatory = $true,
ParameterSetName = 'Path',
HelpMessage = 'Enter one or more filenames',
Position = 0)]
[Parameter(Mandatory = $true,
ParameterSetName = 'PathAll',
Position = 0)]
[string[]]$Path,
[Parameter(Mandatory = $true, ParameterSetName = 'LiteralPathAll')]
[Parameter(Mandatory = $true,
ParameterSetName = 'LiteralPath',
HelpMessage = 'Enter a single filename',
ValueFromPipeline = $true)]
[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 = $true, ParameterSetName = 'PathAll')]
[Parameter(Mandatory = $true, 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
}
if ($Path) {
$Files = Get-ChildItem -Path $Path -Recurse:$Recurse
}
else {
$Files = Get-ChildItem -LiteralPath $LiteralPath
}
}
process {
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
}
}
}
Varje parameteruppsättning måste ha en unik parameter eller en unik kombination av parametrar. Parameteruppsättningarna Path
och PathAll
är mycket lika, men parametern Alla är unik för parameteruppsättningen PathAll
. Samma sak gäller för parameteruppsättningarna LiteralPath
och LiteralPathAll
. Även om parameteruppsättningarna PathAll
och LiteralPathAll
båda har parametern Alla skiljer parametrarna Path och LiteralPath åt dem.
Använd Get-Command -Syntax
visar syntaxen för varje parameteruppsättning. Den visar dock inte namnet på parameteruppsättningen. I följande exempel visas vilka parametrar som kan användas i varje parameteruppsättning.
(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>]
Parameteruppsättningar i praktiken
I det här exemplet använder vi parameteruppsättningen PathAll
.
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