Ler em inglês

Partilhar via


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.

Use Trace-Command para visualizar a vinculação de parâmetros

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-Commando , 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-Helpo , 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