Partilhar via


Sobre o Splatting

BREVE DESCRIÇÃO

Descreve como usar splatting para passar parâmetros para comandos no PowerShell.

DESCRIÇÃO LONGA

[Este tópico foi contribuído por Rohn Edwards de Gulfport, Mississippi, um administrador de sistemas e vencedor da Divisão Avançada dos Jogos de Script de 2012. Revisado para Windows PowerShell 3.0.]

Splatting é um método de passar uma coleção de valores de parâmetro para um comando como unidade. O PowerShell associa cada valor na coleção a um parâmetro de comando. Os valores dos parâmetros splatted são armazenados em variáveis de splatting nomeadas, que se parecem com variáveis padrão, mas começam com um símbolo At (@) em vez de um cifrão ($). O símbolo At informa ao PowerShell que você está passando uma coleção de valores, em vez de um único valor.

Splatting torna os comandos mais curtos e fáceis de ler. Você pode reutilizar os valores de splatting em diferentes chamadas de comando e usar splatting para passar valores de parâmetro da $PSBoundParameters variável automática para outros scripts e funções.

A partir do Windows PowerShell 3.0, você também pode usar o splatting para representar todos os parâmetros de um comando.

SINTAXE

<CommandName> <optional parameters> @<HashTable> <optional parameters>
<CommandName> <optional parameters> @<Array> <optional parameters>

Para fornecer valores de parâmetros para parâmetros posicionais, nos quais os nomes de parâmetros não são necessários, use a sintaxe da matriz. Para fornecer pares de nome e valor de parâmetro, use a sintaxe da tabela de hash. O valor splatted pode aparecer em qualquer lugar na lista de parâmetros.

Ao utilizar splatting, não é necessário usar uma tabela de hash ou uma matriz para passar todos os parâmetros. Você pode passar alguns parâmetros usando splatting e passar outros por posição ou por nome de parâmetro. Além disso, você pode splat vários objetos em um único comando apenas para que você passe não mais de um valor para cada parâmetro.

SPLATTING COM TABELAS DE HASH

Use uma tabela de hash para espalhar nomes de parâmetros e pares de valores. Você pode usar esse formato para todos os tipos de parâmetros, incluindo parâmetros posicionais e de comutação. Os parâmetros posicionais devem ser atribuídos pelo nome.

Os exemplos a seguir comparam dois comandos Copy-Item que copiam o arquivo Test.txt para o arquivo Test2.txt no mesmo diretório.

O primeiro exemplo usa o formato tradicional no qual os nomes dos parâmetros são incluídos.

Copy-Item -Path "test.txt" -Destination "test2.txt" -WhatIf

O segundo exemplo utiliza a técnica de splatting em tabelas de hash. O primeiro comando cria uma tabela de hash de pares parameter-name e parameter-value e a armazena na variável $HashArguments. O segundo comando utiliza a variável $HashArguments num comando com splatting. O símbolo At (@HashArguments) substitui o cifrão ($HashArguments) no comando.

Para fornecer um valor para o parâmetro de opção WhatIf, use $True ou $False.

$HashArguments = @{
  Path = "test.txt"
  Destination = "test2.txt"
  WhatIf = $true
}
Copy-Item @HashArguments

Nota: No primeiro comando, o símbolo At (@) indica uma tabela de hash, não um valor chapeado. A sintaxe para tabelas de hash no PowerShell é: @{\<name\>=\<value\>; \<name\>=\<value\>; ...}*

CHAPEAMENTO COM MATRIZES

Utilize uma matriz para distribuir valores como parâmetros posicionais, que não exigem nomes de parâmetro. Os valores devem estar em ordem de número de posição na matriz.

Os exemplos a seguir comparam dois comandos Copy-Item que copiam o arquivo Test.txt para o arquivo Test2.txt no mesmo diretório.

O primeiro exemplo usa o formato tradicional no qual os nomes dos parâmetros são omitidos. Os valores dos parâmetros aparecem em ordem de posição no comando.

Copy-Item "test.txt" "test2.txt" -WhatIf

O segundo exemplo usa o splatting de matriz. O primeiro comando cria uma matriz dos valores dos parâmetros e a armazena na variável $ArrayArguments. Os valores estão em ordem de posição na matriz. O segundo comando usa a variável $ArrayArguments num comando de splatting. O símbolo At (@ArrayArguments) substitui o cifrão ($ArrayArguments) no comando.

$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf

EXEMPLOS

Este exemplo mostra como reutilizar valores chapeados em comandos diferentes. Os comandos neste exemplo usam o cmdlet Write-Host para gravar mensagens no console do programa host. Usa o splatting para especificar as cores de primeiro plano e plano de fundo.

Para alterar as cores de todos os comandos, basta alterar o valor da variável $Colors.

O primeiro comando cria uma tabela de hash de nomes e valores de parâmetros e armazena a tabela de hash na variável $Colors.

$Colors = @{ForegroundColor = "black"; BackgroundColor = "white"}

O segundo e o terceiro comandos usam a variável $Colors para splatting num comando Write-Host. Para usar o $Colors variable, substitua o cifrão ($Colors) por um símbolo At (@Colors).

#Write a message with the colors in $Colors
Write-Host "This is a test." @Colors

#Write second message with same colors. The position of splatted
#hash table does not matter.
Write-Host @Colors "This is another test."

Este exemplo mostra como encaminhar seus parâmetros para outros comandos usando splatting e a $PSBoundParameters variável automática.

A variável automática $PSBoundParameters é um objeto de dicionário (System.Collections.Generic.Dictionary) que contém todos os nomes de parâmetros e valores usados quando um script ou função é executado.

No exemplo a seguir, usamos a variável $PSBoundParameters para encaminhar os valores de parâmetros passados para um script ou função de Test2 função para a função Test1. Ambas as chamadas para a função Test1 a partir de Test2 utilizam splatting.

function Test1
{
    param($a, $b, $c)

    $a
    $b
    $c
}

function Test2
{
    param($a, $b, $c)

    #Call the Test1 function with $a, $b, and $c.
    Test1 @PsBoundParameters

    #Call the Test1 function with $b and $c, but not with $a
    $LimitedParameters = $PSBoundParameters
    $LimitedParameters.Remove("a") | Out-Null
    Test1 @LimitedParameters
}
Test2 -a 1 -b 2 -c 3
1
2
3
2
3

PARÂMETROS DO COMANDO SPLATTING

Você pode usar splatting para representar os parâmetros de um comando. Essa técnica é útil quando você está criando uma função proxy, ou seja, uma função que chama outro comando. Esse recurso é introduzido no Windows PowerShell 3.0.

Para espalhar os parâmetros de um comando, use @Args para representar os parâmetros do comando. Esta técnica é mais fácil do que enumerar parâmetros de comando e funciona sem revisão, mesmo que os parâmetros do comando chamado mudem.

O recurso usa a variável automática $Args, que contém todos os valores de parâmetros não atribuídos.

Por exemplo, a função a seguir chama o cmdlet Get-Process. Nessa função, @Args representa todos os parâmetros do cmdlet Get-Process.

function Get-MyProcess { Get-Process @Args }

Quando você usa a função Get-MyProcess, todos os parâmetros não atribuídos e valores de parâmetro são passados para @Args, conforme mostrado nos comandos a seguir.

Get-MyProcess -Name PowerShell
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    463      46   225484     237196   719    15.86   3228 powershell
Get-MyProcess -Name PowerShell_Ise -FileVersionInfo
ProductVersion   FileVersion      FileName
--------------   -----------      --------
6.2.9200.16384   6.2.9200.1638... C:\Windows\system32\WindowsPowerShell\...

Você pode usar @Args em uma função que tenha parâmetros explicitamente declarados. Você pode usá-lo mais de uma vez em uma função, mas todos os parâmetros inseridos são passados para todas as instâncias de @Args, conforme mostrado no exemplo a seguir.

function Get-MyCommand
{
    Param ([switch]$P, [switch]$C)
    if ($P) { Get-Process @Args }
    if ($C) { Get-Command @Args }
}

Get-MyCommand -P -C -Name PowerShell
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
408      28    75568      83176   620     1.33   1692 powershell

Path               : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.e
Extension          : .exe
Definition         : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.e
Visibility         : Public
OutputType         : {System.String}
Name               : powershell.exe
CommandType        : Application
ModuleName         :
Module             :
RemotingCapability : PowerShell
Parameters         :
ParameterSets      :
HelpUri            :
FileVersionInfo    : File:             C:\Windows\System32\WindowsPowerShell
                     \v1.0\powershell.exe
                     InternalName:     POWERSHELL
                     OriginalFilename: PowerShell.EXE.MUI
                     FileVersion:      10.0.14393.0 (rs1_release.160715-1616
                     FileDescription:  Windows PowerShell
                     Product:          Microsoft Windows Operating System
                     ProductVersion:   10.0.14393.0
                     Debug:            False
                     Patched:          False
                     PreRelease:       False
                     PrivateBuild:     False
                     SpecialBuild:     False
                     Language:         English (United States)

OBSERVAÇÕES

A Configuração de Estado Desejado (DSC) do PowerShell não foi projetada para usar splatting. Não é possível usar splatting para passar valores para um recurso DSC. Para obter mais informações, consulte o artigo de Gael Colas Pseudo-Splatting DSC Resources.

VER TAMBÉM

about_Arrays

sobre_Variáveis_Automáticas

sobre_Hash_Tables

sobre_Parâmetros