Aracılığıyla paylaş


Parametre bağlamayı görselleştirme

Parametre bağlama, PowerShell'in hangi parametre kümesinin kullanıldığını belirlemek ve değerleri 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şkenlerini bağlayarak 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 işlem hattından bağlanmasının iki yolu vardır. İşlem hattı girişini kabul eden parametreler aşağıdaki özniteliklerden birine veya her ikisine de sahiptir:

  • ValueFromPipeline - İşlem hattındaki değer, türüne göre parametreye bağlıdı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 parametresine bağlıdır. İşlem hattındaki nesne, parametrenin adıyla veya diğer adlarından biriyle eşleşen bir özelliğe sahip olmalıdır. Özelliğin türü parametresinin 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ğlamasını görselleştirmek için kullanın Trace-Command

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

Aşağıdaki senaryoyu değerlendirin. ve olmak üzere iki metin dosyası file1.txt [file2].txtiç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ı işlem hattı üzerinden cmdlet'ine Remove-Item geçirerek 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

yalnızca silindiğini Remove-Item file1.txt ve silinmediğini [file2].txtunutmayın. Dosya adı, joker karakter ifadesi olarak kabul edilen köşeli ayraçlar içerir. kullanarakTrace-Command, dosya adının path parametresine Remove-Itembağlı olduğunu görebilirsiniz.

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

çıkışı Trace-Command ayrıntılı olabilir. Her çıkış satırına bir zaman damgası ve izleme sağlayıcısı bilgileri eklenir. Bu örneğin çıktısı için, ön ek bilgileri okunmasını kolaylaştırmak için 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

kullanarakGet-Help, path parametresinin Remove-Item veya işlem hattından ByValue ByPropertyNamedize nesnelerini kabul ettiğini görebilirsiniz. LiteralPath , işlem hattından ByPropertyNamedize 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

çıktısı Trace-Command , parametre bağlamanın komut satırı parametrelerini bağlayarak başladığını ve ardından işlem hattı girişinin geldiğini gösterir. İşlem hattından bir dize nesnesi aldığını görebilirsiniz Remove-Item . 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

Path parametresi joker karakterleri kabul ettiğinden, köşeli ayraçlar 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 veya ByValueişlem hattından ByPropertyName girişi kabul ettiğini gösterir. Ve iki diğer adı PSPath olduğunu 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}

Bu sonraki örnekte, Get-Item bir FileInfo nesnesi almak için kullanılır. Bu nesnenin PSPath adlı bir özelliği vardır.

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

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

Ardından FileInfo nesnesi öğesine Remove-Itemgeçirilir.

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

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

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

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ğlama için izleme çıkışında, işlem hattından bir FileInfo nesnesi aldığını görebilirsinizRemove-Item. FileInfo nesnesi bir String nesnesi olmadığından Path parametresine bağlanamaz.

FileInfo nesnesinin PSPath özelliği, LiteralPath parametresinin diğer adıyla eşleşir. PSPath aynı zamanda bir String nesnesidir, bu nedenle 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