Parametre bağlamayı görselleştirin


Parametre bağlama, PowerShell'in hangi parametre kümesinin kullanıldığını belirlemek ve değerleri bir komutun parametreleriyle ilişkilendirmek (bağlamak) için kullandığı işlemdir. Bu değerler komut satırından ve işlem hattından gelebilir.

Parametre bağlama işlemi, adlandırılmış ve konumsal komut satırı bağımsız değişkenlerinin bağlanmasıyla başlar. Komut satırı bağımsız değişkenlerini bağladıktan sonra PowerShell herhangi bir işlem hattı girişini bağlamaya çalışır. Değerlerin ardışık düzenden bağlanmasının iki yolu vardır. İşlem hattı girişini kabul eden parametreler aşağıdaki özelliklerden birine veya her ikisine sahiptir:

  • ValueFromPipeline - İşlem hattındaki değer, türüne göre parametreye bağlanır. Bağımsız değişkenin türü parametrenin türüyle eşleşmelidir.
  • ValueFromPipelineByPropertyName - İşlem hattındaki değer, adına göre parametreye bağlanır. İşlem hattındaki nesnenin, parametrenin adıyla veya takma adlarından biriyle eşleşen bir özelliği olması gerekir. Özelliğin türü parametrenin türüyle eşleşmeli veya dönüştürülebilir olmalıdır.

Parametre bağlama hakkında daha fazla bilgi için bkz. about_Parameter_Binding.

Parametre bağlamayı görselleştirmek için Trace-Command'ı kullanın

Parametre bağlama sorunlarının giderilmesi zor olabilir. Parametre bağlama işlemini görselleştirmek için Trace-Command cmdlet'ini kullanabilirsiniz.

Aşağıdaki senaryoyu düşünün. file1.txt ve [file2].txt olmak üzere iki metin dosyası içeren bir dizininiz var.

PS> Get-ChildItem

    Directory: D:\temp\test\binding

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           5/17/2024 12:59 PM              0 [file2].txt
-a---           5/17/2024 12:59 PM              0 file1.txt

Dosya adlarını ardışık düzen aracılığıyla Remove-Item cmdlet'ine ileterek dosyaları silmek istiyorsunuz.

PS> 'file1.txt', '[file2].txt' | Remove-Item
PS> Get-ChildItem

    Directory: D:\temp\test\binding

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           5/17/2024 12:59 PM              0 [file2].txt

Remove-Item'in yalnızca file1.txt'yi sildiğine, [file2].txt'yi silmediğine dikkat edin. Dosya adı, joker karakter ifadesi olarak kabul edilen köşeli parantezler içerir. Trace-Command'ı kullanarak, dosya adının Remove-Item'in Path parametresine bağlandığını görebilirsiniz.

Trace-Command -PSHost -Name ParameterBinding -Expression {
    '[file2].txt' | Remove-Item
}

Trace-Command'ın çıktısı ayrıntılı olabilir. Her çıktı satırına bir zaman damgası ve izleme sağlayıcı bilgisi eklenir. Bu örneğin çıktısı için, okumayı kolaylaştırmak amacıyla önek bilgisi kaldırılmıştır.

BIND NAMED cmd line args [Remove-Item]
BIND POSITIONAL cmd line args [Remove-Item]
BIND cmd line args to DYNAMIC parameters.
    DYNAMIC parameter object: [Microsoft.PowerShell.Commands.FileSystemProviderRemoveItemDynamicParameters]
MANDATORY PARAMETER CHECK on cmdlet [Remove-Item]
CALLING BeginProcessing
BIND PIPELINE object to parameters: [Remove-Item]
    PIPELINE object TYPE = [System.String]
    RESTORING pipeline parameter's original values
    Parameter [Path] PIPELINE INPUT ValueFromPipeline NO COERCION
    BIND arg [[file2].txt] to parameter [Path]
        Binding collection parameter Path: argument type [String], parameter type [System.String[]],
            collection type Array, element type [System.String], no coerceElementType
        Creating array with element type [System.String] and 1 elements
        Argument type String is not IList, treating this as scalar
        Adding scalar element of type String to array position 0
        BIND arg [System.String[]] to param [Path] SUCCESSFUL
    Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
    Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
    Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName WITH COERCION
    Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName WITH COERCION
MANDATORY PARAMETER CHECK on cmdlet [Remove-Item]
CALLING ProcessRecord
CALLING EndProcessing

Get-Help'i kullanarak, Remove-Item'in Path parametresinin ByValue veya MülkAdına Göre. LiteralPath, ByPropertyName ardışık düzenindeki dize nesnelerini kabul eder.

PS> Get-Help Remove-Item -Parameter Path, LiteralPath

-Path <System.String[]>
    Specifies a path of the items being removed. Wildcard characters are permitted.

    Required?                    true
    Position?                    0
    Default value                None
    Accept pipeline input?       True (ByPropertyName, ByValue)
    Accept wildcard characters?  true


-LiteralPath <System.String[]>
    Specifies a path to one or more locations. The value of LiteralPath is used exactly as it's
    typed. No characters are interpreted as wildcards. If the path includes escape characters,
    enclose it in single quotation marks. Single quotation marks tell PowerShell not to interpret
    any characters as escape sequences.

    Required?                    true
    Position?                    named
    Default value                None
    Accept pipeline input?       True (ByPropertyName)
    Accept wildcard characters?  false

Trace-Command çıktısı, parametre bağlamanın komut satırı parametrelerini bağlama ve ardından ardışık düzen girişiyle başladığını gösterir. Remove-Item'in ardışık düzenden bir dize nesnesi aldığını görebilirsiniz. Bu dize nesnesi Path parametresine bağlıdır.

BIND PIPELINE object to parameters: [Remove-Item]
    PIPELINE object TYPE = [System.String]
    RESTORING pipeline parameter's original values
    Parameter [Path] PIPELINE INPUT ValueFromPipeline NO COERCION
    BIND arg [[file2].txt] to parameter [Path]
    ...
        BIND arg [System.String[]] to param [Path] SUCCESSFUL

Yol parametresi joker karakterleri kabul ettiğinden, köşeli parantezler bir joker karakter ifadesini temsil eder. Ancak bu ifade dizindeki hiçbir dosyayla eşleşmiyor. Dosyanın tam yolunu belirtmek için LiteralPath parametresini kullanmanız gerekir.

Get-Command, LiteralPath parametresinin ByPropertyName veya ByValue ardışık düzeninden girişi kabul ettiğini gösterir. Ayrıca iki takma adı vardır: PSPath ve LP.

PS> (Get-Command Remove-Item).Parameters.LiteralPath.Attributes |
>> Select-Object ValueFrom*, Alias* | Format-List

ValueFromPipeline               : False
ValueFromPipelineByPropertyName : True
ValueFromRemainingArguments     : False

AliasNames : {PSPath, LP}

Sonraki örnekte, FileInfo nesnesini almak için Get-Item kullanılıyor. Bu nesnenin PSPath adında bir özelliği var.

PS> Get-Item *.txt | Select-Object PSPath

PSPath
------
Microsoft.PowerShell.Core\FileSystem::D:\temp\test\binding\[file2].txt

Daha sonra FileInfo nesnesi Remove-Item'e aktarılır.

Trace-Command -PSHost -Name ParameterBinding -Expression {
    Get-Item *.txt | Remove-Item
}

Bu örneğin çıktısı için, önek bilgileri kaldırılmış ve her iki komut için parametre bağlamayı gösterecek şekilde ayrılmıştır.

Bu çıktıda, Get-Item'in *.txt konumsal parametre değerini Path parametresine bağladığını görebilirsiniz.

BIND NAMED cmd line args [Get-Item]
BIND POSITIONAL cmd line args [Get-Item]
    BIND arg [*.txt] to parameter [Path]
        Binding collection parameter Path: argument type [String], parameter type [System.String[]],
            collection type Array, element type [System.String], no coerceElementType
        Creating array with element type [System.String] and 1 elements
        Argument type String is not IList, treating this as scalar
        Adding scalar element of type String to array position 0
        BIND arg [System.String[]] to param [Path] SUCCESSFUL
BIND cmd line args to DYNAMIC parameters.
    DYNAMIC parameter object: [Microsoft.PowerShell.Commands.FileSystemProviderGetItemDynamicParameters]
MANDATORY PARAMETER CHECK on cmdlet [Get-Item]

Parametre bağlamaya ilişkin izleme çıktısında, Remove-Item öğesinin ardışık düzenden bir FileInfo nesnesi aldığını görebilirsiniz. FileInfo nesnesi bir String nesnesi olmadığından Path parametresine bağlanamaz.

FileInfo nesnesinin PSPath özelliği, LiteralPath parametresine yönelik bir takma adla eşleşir. PSPath aynı zamanda bir String nesnesidir, dolayısıyla tür zorlaması olmadan LiteralPath parametresine bağlanabilir.

BIND NAMED cmd line args [Remove-Item]
BIND POSITIONAL cmd line args [Remove-Item]
BIND cmd line args to DYNAMIC parameters.
    DYNAMIC parameter object: [Microsoft.PowerShell.Commands.FileSystemProviderRemoveItemDynamicParameters]
MANDATORY PARAMETER CHECK on cmdlet [Remove-Item]
CALLING BeginProcessing
CALLING BeginProcessing
CALLING ProcessRecord
    BIND PIPELINE object to parameters: [Remove-Item]
        PIPELINE object TYPE = [System.IO.FileInfo]
        RESTORING pipeline parameter's original values
        Parameter [Path] PIPELINE INPUT ValueFromPipeline NO COERCION
        BIND arg [D:\temp\test\binding\[file2].txt] to parameter [Path]
            Binding collection parameter Path: argument type [FileInfo], parameter type [System.String[]],
                collection type Array, element type [System.String], no coerceElementType
            Creating array with element type [System.String] and 1 elements
            Argument type FileInfo is not IList, treating this as scalar
            BIND arg [D:\temp\test\binding\[file2].txt] to param [Path] SKIPPED
        Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
        Parameter [Path] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
        Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
        Parameter [LiteralPath] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
        BIND arg [Microsoft.PowerShell.Core\FileSystem::D:\temp\test\binding\[file2].txt] to parameter [LiteralPath]
            Binding collection parameter LiteralPath: argument type [String], parameter type [System.String[]],
                collection type Array, element type [System.String], no coerceElementType
            Creating array with element type [System.String] and 1 elements
            Argument type String is not IList, treating this as scalar
            Adding scalar element of type String to array position 0
            BIND arg [System.String[]] to param [LiteralPath] SUCCESSFUL
        Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName WITH COERCION
    MANDATORY PARAMETER CHECK on cmdlet [Remove-Item]
    CALLING ProcessRecord
CALLING EndProcessing
CALLING EndProcessing

İlgili makaleler