Bagikan melalui


Memvisualisasikan pengikatan parameter

Pengikatan parameter adalah proses yang digunakan PowerShell untuk menentukan kumpulan parameter mana yang digunakan dan untuk mengaitkan nilai (mengikat) ke parameter perintah. Nilai-nilai ini dapat berasal dari baris perintah dan alur.

Proses pengikatan parameter dimulai dengan mengikat argumen baris perintah bernama dan posisi. Setelah mengikat argumen baris perintah, PowerShell mencoba mengikat input alur apa pun. Ada dua cara agar nilai terikat dari alur. Parameter yang menerima input alur memiliki satu atau kedua atribut berikut:

  • ValueFromPipeline - Nilai dari alur terikat ke parameter berdasarkan jenisnya. Jenis argumen harus cocok dengan jenis parameter.
  • ValueFromPipelineByPropertyName - Nilai dari alur terikat ke parameter berdasarkan namanya. Objek dalam alur harus memiliki properti yang cocok dengan nama parameter atau salah satu aliasnya. Jenis properti harus cocok atau dapat dikonversi ke jenis parameter.

Untuk informasi selengkapnya tentang pengikatan parameter, lihat about_Parameter_Binding.

Gunakan Trace-Command untuk memvisualisasikan pengikatan parameter

Pemecahan masalah pengikatan parameter bisa menjadi tantangan. Anda dapat menggunakan cmdlet Trace-Command untuk memvisualisasikan proses pengikatan parameter.

Pertimbangkan skenario berikut. Anda memiliki direktori dengan dua file teks, file1.txt dan [file2].txt.

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

Anda ingin menghapus file dengan meneruskan nama file, melalui alur, ke Remove-Item cmdlet.

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

Perhatikan bahwa Remove-Item hanya dihapus file1.txt dan bukan [file2].txt. Nama file menyertakan tanda kurung siku, yang diperlakukan sebagai ekspresi kartubebas. Menggunakan Trace-Command, Anda dapat melihat bahwa nama file sedang terikat ke parameter Jalur .Remove-Item

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

Output dari Trace-Command bisa verbose. Setiap baris output diawali dengan tanda waktu dan informasi penyedia pelacakan. Untuk output contoh ini, informasi awalan telah dihapus untuk membuatnya lebih mudah dibaca.

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

Menggunakan Get-Help, Anda dapat melihat bahwa parameter Remove-Item Jalur menerima objek string dari alur ByValue atau ByPropertyName. LiteralPath menerima objek string dari alur ByPropertyName.

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

Output Trace-Command menunjukkan bahwa pengikatan parameter dimulai dengan mengikat parameter baris perintah diikuti oleh input alur. Anda dapat melihat bahwa Remove-Item menerima objek string dari alur. Objek string tersebut terikat ke parameter Jalur .

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

Karena parameter Jalur menerima karakter kartubebas, tanda kurung siku mewakili ekspresi kartubebas. Namun, ekspresi tersebut tidak cocok dengan file apa pun di direktori. Anda perlu menggunakan parameter LiteralPath untuk menentukan jalur yang tepat ke file.

Get-Command menunjukkan bahwa parameter LiteralPath menerima input dari alur ByPropertyName atau ByValue. Dan, bahwa ia memiliki dua alias, PSPath dan LP.

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

ValueFromPipeline               : False
ValueFromPipelineByPropertyName : True
ValueFromRemainingArguments     : False

AliasNames : {PSPath, LP}

Dalam contoh berikutnya ini, Get-Item digunakan untuk mengambil objek FileInfo . Objek tersebut memiliki properti bernama PSPath.

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

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

Objek FileInfo kemudian diteruskan ke Remove-Item.

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

Untuk output contoh ini, informasi awalan telah dihapus dan dipisahkan untuk menampilkan pengikatan parameter untuk kedua perintah.

Dalam output ini, Anda dapat melihat bahwa Get-Item mengikat nilai *.txt parameter posisi ke parameter Jalur .

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]

Dalam output pelacakan untuk pengikatan parameter, Anda dapat melihat bahwa Remove-Item menerima objek FileInfo dari alur. Karena objek FileInfo bukan objek String, objek tersebut tidak dapat terikat ke parameter Jalur.

Properti PSPath dari objek FileInfo cocok dengan alias untuk parameter LiteralPath. PSPath juga merupakan objek String , sehingga dapat terikat ke parameter LiteralPath tanpa pemaksaan jenis.

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