Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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