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