Aracılığıyla paylaş


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.

Not

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

Varsayılan parametre kümeleri

Birden çok parametre kümesi tanımlandığında, DefaultParameterSetName ö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 her parametre için ParameterSetName ö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.

Ayrılmış parametre kümesi adı

PowerShell, özel işleme için parametre kümesi adını __AllParameterSets ayırır.

__AllParameterSets , açık bir varsayılan ad kullanılmadığında varsayılan parametre kümesinin adıdır.

ParameterSetName Parameter özniteliğinin olarak __AllParameterSets ayarlanması, atanmamasıyla ParameterSetNameeşdeğerdir. Her iki durumda da parametre tüm parametre kümelerine aittir.

Not

CmdletBinding özniteliği olarak ayarlamanızı DefaultParameterSetName__AllParameterSetsengellemez. Bunu yaparsanız PowerShell, Parameter özniteliği tarafından düzgün başvurulameyecek açık bir parametre kümesi oluşturur.

Ö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 Tüm parametresi PathAll parametre kümesine özeldir. Aynı durum LiteralPath ve LiteralPathAll parametre kümeleriyle de geçerlidir. PathAll ve LiteralPathAll parametre kümelerinin her ikisi de Tüm parametresine sahip olsa da, Yolu ve LiteralPath parametreleri bunları ayırt eder.

Kullan 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 PathAll parametre kümesi kullanılır.

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, Get-ChildItem cmdlet'in 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