about_Parameter_Sets
Deskripsi singkat
Menjelaskan cara menentukan dan menggunakan set parameter dalam fungsi tingkat lanjut.
Deskripsi panjang
PowerShell menggunakan set parameter untuk memungkinkan Anda menulis satu fungsi yang dapat melakukan tindakan yang berbeda untuk skenario yang berbeda. Set parameter memungkinkan Anda mengekspos parameter yang berbeda kepada pengguna. Dan, untuk mengembalikan informasi yang berbeda berdasarkan parameter yang ditentukan oleh pengguna. Anda hanya dapat menggunakan satu parameter yang ditetapkan pada satu waktu.
Persyaratan set parameter
Persyaratan berikut berlaku untuk semua set parameter.
Jika tidak ada set parameter yang ditentukan untuk parameter, parameter milik semua set parameter.
Setiap set parameter harus memiliki kombinasi parameter yang unik. Jika memungkinkan, setidaknya salah satu parameter unik harus menjadi parameter wajib.
Set parameter yang berisi beberapa parameter posisi harus menentukan posisi unik untuk setiap parameter. Tidak ada dua parameter posisi yang dapat menentukan posisi yang sama.
Hanya satu parameter dalam satu set yang dapat mendeklarasikan
ValueFromPipeline
kata kunci dengan nilaitrue
. Beberapa parameter dapat menentukanValueFromPipelineByPropertyName
kata kunci dengan nilaitrue
.
Catatan
Ada batas 32 set parameter.
Set parameter default
Saat beberapa set parameter ditentukan, DefaultParameterSetName
kata kunci atribut CmdletBinding menentukan kumpulan parameter default.
PowerShell menggunakan parameter default yang ditetapkan saat tidak dapat menentukan parameter yang diatur untuk digunakan berdasarkan informasi yang diberikan ke perintah . Untuk informasi selengkapnya tentang atribut CmdletBinding , lihat about_Functions_CmdletBindingAttribute.
Mendeklarasikan set parameter
Untuk membuat set parameter, Anda harus menentukan ParameterSetName
kata kunci atribut Parameter untuk setiap parameter dalam set parameter. Untuk parameter yang termasuk dalam beberapa set parameter, tambahkan atribut Parameter untuk setiap set parameter.
Atribut Parameter memungkinkan Anda menentukan parameter secara berbeda untuk setiap set parameter. Misalnya, Anda dapat menentukan parameter sebagai wajib dalam satu set dan opsional di set lain. Namun, setiap set parameter harus berisi setidaknya satu parameter unik.
Parameter yang tidak memiliki nama set parameter yang ditetapkan milik semua set parameter.
Contoh
Contoh fungsi berikut menghitung baris angka, karakter, dan kata dalam file teks. Dengan menggunakan parameter, Anda dapat menentukan nilai mana yang ingin Anda kembalikan dan file mana yang ingin Anda ukur. Ada empat set parameter yang ditentukan:
- Jalur
- 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
}
}
}
Setiap set parameter harus memiliki parameter unik atau kombinasi parameter yang unik. Path
Set parameter dan PathAll
sangat mirip tetapi parameter Semua unik untuk PathAll
set parameter. Hal yang sama berlaku dengan LiteralPath
set parameter dan LiteralPathAll
. Meskipun PathAll
set parameter dan LiteralPathAll
keduanya memiliki parameter Semua , parameter Path dan LiteralPath membedakannya .
Gunakan Get-Command -Syntax
menunjukkan sintaks setiap set parameter. Namun tidak menampilkan nama kumpulan parameter. Contoh berikut menunjukkan parameter mana yang dapat digunakan di setiap set parameter.
(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>]
Set parameter dalam tindakan
Contohnya menggunakan PathAll
set parameter.
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
Kesalahan menggunakan parameter dari beberapa set
Dalam contoh ini, parameter unik dari set parameter yang berbeda digunakan.
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.
Parameter Path dan LiteralPath unik untuk set parameter cmdlet yang Get-ChildItem
berbeda. Ketika parameter dijalankan bersama-sama dalam cmdlet yang sama, kesalahan akan muncul. Hanya satu set parameter yang dapat digunakan per panggilan cmdlet pada satu waktu.
Cara mengetahui set parameter mana yang digunakan
Variabel $PSCmdlet
otomatis menyediakan properti ParameterSetName .
Properti ini berisi nama set parameter yang digunakan. Anda dapat menggunakan properti ini dalam fungsi Anda untuk menentukan set parameter mana yang digunakan untuk memilih perilaku set-spesifik parameter.
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