Visualize a vinculação de parâmetros
A associação de parâmetros é o processo que o PowerShell usa para determinar qual conjunto de parâmetros está sendo usado e para associar (vincular) valores aos parâmetros de um comando. Esses valores podem vir da linha de comando e do pipeline.
O processo de vinculação de parâmetros começa pela vinculação de argumentos de linha de comando nomeados e posicionais. Depois de vincular argumentos de linha de comando, o PowerShell tenta vincular qualquer entrada de pipeline. Há duas maneiras pelas quais os valores são vinculados a partir do pipeline. Os parâmetros que aceitam entrada de pipeline têm um ou ambos os seguintes atributos:
- ValueFromPipeline - O valor do pipeline é vinculado ao parâmetro com base em seu tipo. O tipo do argumento deve corresponder ao tipo do parâmetro.
- ValueFromPipelineByPropertyName - O valor do pipeline é vinculado ao parâmetro com base em seu nome. O objeto no pipeline deve ter uma propriedade que corresponda ao nome do parâmetro ou a um de seus aliases. O tipo da propriedade deve corresponder ou ser conversível para o tipo do parâmetro.
Para obter mais informações sobre vinculação de parâmetros, consulte about_Parameter_Binding.
A solução de problemas de vinculação de parâmetros pode ser um desafio. Você pode usar o cmdlet Trace-Command para visualizar o processo de vinculação de parâmetros.
Considere o seguinte cenário de exemplo. Você tem um diretório com dois arquivos de file1.txt
texto e [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
Você deseja excluir os arquivos passando os nomes dos arquivos, através do pipeline, para o 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
Observe que Remove-Item
apenas excluído file1.txt
e não [file2].txt
. O nome do arquivo inclui colchetes, que é tratado como uma expressão curinga. Usando Trace-Command
o , você pode ver que o nome do arquivo está sendo vinculado ao parâmetro Path de Remove-Item
.
Trace-Command -PSHost -Name ParameterBinding -Expression {
'[file2].txt' | Remove-Item
}
A saída de Trace-Command
pode ser detalhada. Cada linha de saída é prefixada com um carimbo de data/hora e informações do provedor de rastreamento. Para a saída deste exemplo, as informações de prefixo foram removidas para facilitar a leitura.
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
Usando Get-Help
o , você pode ver que o parâmetro Path de aceita objetos de cadeia de Remove-Item
caracteres do pipeline ByValue
ou ByPropertyName
. LiteralPath aceita objetos de cadeia de caracteres do pipeline 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
A saída de mostra que a vinculação de parâmetros começa pela vinculação de parâmetros de linha de Trace-Command
comando seguida pela entrada do pipeline. Você pode ver que Remove-Item
recebe um objeto de cadeia de caracteres do pipeline. Esse objeto string está vinculado ao parâmetro Path .
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
Como o parâmetro Path aceita caracteres curinga, os colchetes representam uma expressão curinga. No entanto, essa expressão não corresponde a nenhum arquivo no diretório. Você precisa usar o parâmetro LiteralPath para especificar o caminho exato para o arquivo.
Get-Command
mostra que o parâmetro LiteralPath aceita entrada do pipeline ByPropertyName
ou ByValue
. E que tem dois pseudónimos, PSPath
e LP
.
PS> (Get-Command Remove-Item).Parameters.LiteralPath.Attributes |
>> Select-Object ValueFrom*, Alias* | Format-List
ValueFromPipeline : False
ValueFromPipelineByPropertyName : True
ValueFromRemainingArguments : False
AliasNames : {PSPath, LP}
Neste próximo exemplo, Get-Item
é usado para recuperar um objeto FileInfo . Esse objeto tem uma propriedade chamada PSPath.
PS> Get-Item *.txt | Select-Object PSPath
PSPath
------
Microsoft.PowerShell.Core\FileSystem::D:\temp\test\binding\[file2].txt
O objeto FileInfo é então passado para Remove-Item
.
Trace-Command -PSHost -Name ParameterBinding -Expression {
Get-Item *.txt | Remove-Item
}
Para a saída deste exemplo, as informações de prefixo foram removidas e separadas para mostrar a vinculação de parâmetros para ambos os comandos.
Nesta saída, você pode ver que Get-Item
vincula o valor *.txt
do parâmetro posicional ao parâmetro Path .
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]
Na saída de rastreamento para vinculação de parâmetros, você pode ver que Remove-Item
recebe um objeto FileInfo do pipeline. Como um objeto FileInfo não é um objeto String , ele não pode ser vinculado ao parâmetro Path .
A propriedade PSPath do objeto FileInfo corresponde a um alias para o parâmetro LiteralPath. PSPath também é um objeto String, portanto, pode ser vinculado ao parâmetro LiteralPath sem coerção de tipo.
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
Comentários do PowerShell
O PowerShell é um projeto código aberto. Selecione um link para fornecer comentários: