about_Parameter_Sets

Kısa açıklama

Gelişmiş işlevlerde parametre kümelerinin nasıl tanımlanıp kullanılacağını açıklar.

Uzun açıklama

PowerShell, farklı senaryolar için farklı eylemler gerçekleştirebilen tek bir işlev yazmanızı sağlamak için parametre kümelerini kullanır. Parametre kümeleri, kullanıcıya farklı parametreler sunmanızı sağlar. Ayrıca, kullanıcı tarafından belirtilen parametrelere göre farklı bilgiler döndürmek için. Aynı anda yalnızca bir parametre kümesi kullanabilirsiniz.

Parametre kümesi gereksinimleri

Aşağıdaki gereksinimler tüm parametre kümeleri için geçerlidir.

  • Parametre için parametre kümesi belirtilmezse, parametre tüm parametre kümelerine aittir.

  • Her parametre kümesinin benzersiz bir parametre bileşimi olmalıdır. Mümkünse, benzersiz parametrelerden en az biri zorunlu bir parametre olmalıdır.

  • Birden çok konumsal parametre içeren bir parametre kümesi, her parametre için benzersiz konumlar tanımlamalıdır. Hiçbir iki konumsal parametre aynı konumu belirtemez.

  • Bir kümedeki yalnızca bir parametre anahtar sözcüğünü ValueFromPipeline değeriyle truebildirebilir. Birden çok parametre anahtar sözcüğünü ValueFromPipelineByPropertyName değeriyle truetanımlayabilir.

Not

32 parametre kümesi sınırı vardır.

Varsayılan parametre kümeleri

Birden çok parametre kümesi tanımlandığında, DefaultParameterSetName CmdletBinding özniteliğinin anahtar sözcüğü varsayılan parametre kümesini belirtir. PowerShell, komutuna sağlanan bilgilere göre kullanılacak parametre kümesini belirleyemediğinde varsayılan parametre kümesini kullanır. CmdletBinding özniteliği hakkında daha fazla bilgi için bkz. about_Functions_CmdletBindingAttribute.

Parametre kümeleri bildiriyor

Parametre kümesi oluşturmak için parametre kümesindeki ParameterSetNameher parametre için Parameter özniteliğinin anahtar sözcüğünü belirtmeniz gerekir. Birden çok parametre kümesine ait parametreler için, her parametre kümesi için bir Parametre özniteliği ekleyin.

Parameter özniteliği, parametreyi her parametre kümesi için farklı tanımlamanızı sağlar. Örneğin, bir parametreyi bir kümede zorunlu, başka bir kümede isteğe bağlı olarak tanımlayabilirsiniz. Ancak, her parametre kümesi en az bir benzersiz parametre içermelidir.

Atanmış parametre kümesi adı olmayan parametreler tüm parametre kümelerine aittir.

Örnekler

Aşağıdaki örnek işlev, bir metin dosyasındaki sayı satırlarını, karakterleri ve sözcükleri sayar. Parametreleri kullanarak, döndürülmesini istediğiniz değerleri ve ölçmek istediğiniz dosyaları belirtebilirsiniz. Tanımlanan dört parametre kümesi vardır:

  • Yol
  • PathAll
  • Değişmez Değer Yolu
  • 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
        }
    }
}

Her parametre kümesinin benzersiz bir parametresi veya benzersiz bir parametre bileşimi olmalıdır. Path ve PathAll parametre kümeleri çok benzerdir, ancak All parametresi parametre kümesine PathAll özeldir. ve parametre kümeleriyle LiteralPathLiteralPathAll aynı durum geçerlidir. ve parametre kümelerinin PathAll her ikisi de All parametresine sahip olsa da, Path ve LiteralPath parametreleri bunları ayırt eder.LiteralPathAll

Use Get-Command -Syntax , her parametre kümesinin söz dizimini gösterir. Ancak parametre kümesinin adını göstermez. Aşağıdaki örnek, her parametre kümesinde hangi parametrelerin kullanılabileceğini gösterir.

(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>]

Parametre kümeleri eylemde

Örnekte parametre kümesi kullanılır 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

Birden çok kümeden parametre kullanma hatası

Bu örnekte, farklı parametre kümelerinden benzersiz parametreler kullanılır.

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.

Path ve LiteralPath parametreleri, cmdlet'in Get-ChildItem farklı parametre kümelerine özeldir. Parametreler aynı cmdlet'te birlikte çalıştırıldığında bir hata oluşur. Aynı anda cmdlet çağrısı başına yalnızca bir parametre kümesi kullanılabilir.

Hangi parametre kümesinin kullanıldığını öğrenme

Otomatik değişken $PSCmdlet ParameterSetName özelliğini sağlar. Bu özellik, kullanılmakta olan parametre kümesinin adını içerir. Parametre kümesine özgü davranışı seçmek için hangi parametre kümesinin kullanıldığını belirlemek için işlevinizde bu özelliği kullanabilirsiniz.

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