Compartir a través de


about_Splatting

Descripción breve

Describe cómo usar la expansión para pasar parámetros a comandos en PowerShell.

Descripción larga

La expansión es un método para pasar una colección de valores de parámetro a un comando como una unidad. PowerShell asocia cada valor de la colección con un parámetro de comando. Los valores de parámetros de la placa se almacenan en variables de expansión con nombre, que tienen un aspecto similar a las variables estándar, pero comienzan con un símbolo At (@) en lugar de un signo de dólar ($). El símbolo At indica a PowerShell que está pasando una colección de valores, en lugar de un solo valor.

La expansión hace que los comandos sean más cortos y fáciles de leer. Puede reutilizar los valores de expansión en diferentes llamadas de comando y usar la expansión para pasar valores de parámetros de la $PSBoundParameters variable automática a otros scripts y funciones.

A partir de Windows PowerShell 3.0, también puede usar la expansión para representar todos los parámetros de un comando.

Syntax

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

Para proporcionar valores de parámetro para parámetros posicionales, en los que no se requieren nombres de parámetro, use la sintaxis de la matriz. Para proporcionar pares nombre de parámetro y valor, use la sintaxis de la tabla hash. El valor de la placa puede aparecer en cualquier parte de la lista de parámetros.

Al realizar la expansión, no es necesario usar una tabla hash ni una matriz para pasar todos los parámetros. Puede pasar algunos parámetros mediante la expansión y pasar otros por posición o por nombre de parámetro. Además, puede expandir varios objetos en un solo comando para que no pase más de un valor para cada parámetro.

A partir de PowerShell 7.1, puede invalidar un parámetro de expansión definiendo explícitamente un parámetro en un comando.

Expansión con tablas hash

Use una tabla hash para splat parameter name and value pairs (Nombre de parámetro de splat y pares de valores). Puede usar este formato para todos los tipos de parámetros, incluidos los parámetros posicionales y switch. Los parámetros posicionales deben asignarse por nombre.

En los ejemplos siguientes se comparan dos Copy-Item comandos que copian el archivo Test.txt en el archivo Test2.txt en el mismo directorio.

En el primer ejemplo se usa el formato tradicional en el que se incluyen los nombres de parámetro.

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

En el segundo ejemplo se usa la expansión de tablas hash. El primer comando crea una tabla hash de pares parameter-name y parameter-value y la almacena en la $HashArguments variable. El segundo comando usa la $HashArguments variable en un comando con expansión. El símbolo At (@HashArguments) reemplaza el signo de dólar ($HashArguments) en el comando .

Para proporcionar un valor para el parámetro del modificador WhatIf , use $True o $False.

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

Nota

En el primer comando, el símbolo At (@) indica una tabla hash, no un valor de placa. La sintaxis de las tablas hash en PowerShell es: @{<name>=<value>; <name>=<value>; ...}

Expansión con matrices

Use una matriz para splat values for positional parameters (Valores de plataforma para parámetros posicionales), que no requieren nombres de parámetro. Los valores deben estar en orden de posición en la matriz.

En los ejemplos siguientes se comparan dos Copy-Item comandos que copian el archivo Test.txt en el archivo Test2.txt en el mismo directorio.

En el primer ejemplo se usa el formato tradicional en el que se omiten los nombres de parámetro. Los valores de parámetro aparecen en orden de posición en el comando.

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

En el segundo ejemplo se usa la expansión de matrices. El primer comando crea una matriz de los valores de parámetro y la almacena en la $ArrayArguments variable . Los valores están en orden de posición en la matriz. El segundo comando usa la $ArrayArguments variable en un comando en la expansión. El símbolo At (@ArrayArguments) reemplaza el signo de dólar ($ArrayArguments) en el comando .

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

Uso del parámetro ArgumentList

Varios cmdlets tienen un parámetro ArgumentList que se usa para pasar valores de parámetro a un bloque de script que ejecuta el cmdlet. El parámetro ArgumentList toma una matriz de valores que se pasa al bloque de script. PowerShell usa eficazmente la expansión de matrices para enlazar los valores a los parámetros del bloque de script. Al usar ArgumentList, si necesita pasar una matriz como un único objeto enlazado a un único parámetro, debe encapsular la matriz como el único elemento de otra matriz.

En el ejemplo siguiente se incluye un bloque de script que toma un único parámetro que es una matriz de cadenas.

$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
  param([string[]]$words) $words -join ' '
  } -ArgumentList $array

En este ejemplo, solo se pasa el primer elemento de $array al bloque de script.

Hello
$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
  param([string[]]$words) $words -join ' '
} -ArgumentList (,$array)

En este ejemplo, $array se encapsula en una matriz para que toda la matriz se pase al bloque de script como un solo objeto.

Hello World!

Ejemplos

Ejemplo 1: Reutilización de parámetros de placa en distintos comandos

En este ejemplo se muestra cómo reutilizar valores de placa en distintos comandos. Los comandos de este ejemplo usan el Write-Host cmdlet para escribir mensajes en la consola del programa host. Usa la expansión para especificar los colores de primer plano y de fondo.

Para cambiar los colores de todos los comandos, simplemente cambie el valor de la $Colors variable.

El primer comando crea una tabla hash de nombres y valores de parámetros y almacena la tabla hash en la $Colors variable.

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

Los comandos segundo y tercero usan la $Colors variable para la expansión en un Write-Host comando. Para usar $Colors variable, reemplace el signo de dólar ($Colors) por un 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."

Ejemplo 2: Reenviar parámetros mediante $PSBoundParameters

En este ejemplo se muestra cómo reenviar sus parámetros a otros comandos mediante la expansión y la $PSBoundParameters variable automática.

La $PSBoundParameters variable automática es un objeto de diccionario (System.Collections.Generic.Dictionary) que contiene todos los nombres y valores de parámetro que se usan cuando se ejecuta un script o una función.

En el ejemplo siguiente, se usa la $PSBoundParameters variable para reenviar los valores de parámetros pasados a un script o función de Test2 la función a la Test1 función. Ambas llamadas a la Test1 función de Test2 usan la expansión.

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

    "a = $a"
    "b = $b"
    "c = $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
    Test1 -b $PSBoundParameters.b -c $PSBoundParameters.c
}

Test2 -a 1 -b 2 -c 3
a = 1
b = 2
c = 3
a =
b = 2
c = 3

Ejemplo 3: Invalidación de parámetros con parámetros definidos explícitamente

En este ejemplo se muestra cómo invalidar un parámetro con parámetros definidos explícitamente. Esto es útil cuando no desea crear una nueva tabla hash o cambiar un valor en la tabla hash que está usando para splat.

La $commonParams variable almacena los parámetros para crear máquinas virtuales en la East US ubicación. La $allVms variable es una lista de máquinas virtuales que se van a crear. Recorremos la lista y usamos $commonParams para expandir los parámetros para crear cada máquina virtual. Sin embargo, queremos myVM2 crearlo en una región diferente a la de las demás máquinas virtuales. En lugar de ajustar la $commonParams tabla hash, puede definir explícitamente el parámetro Location en New-AzVm para reemplazar el valor de la Location clave en $commonParams.

$commonParams = @{
    ResourceGroupName = "myResourceGroup"
    Location = "East US"
    VirtualNetworkName = "myVnet"
    SubnetName = "mySubnet"
    SecurityGroupName = "myNetworkSecurityGroup"
    PublicIpAddressName = "myPublicIpAddress"
}

$allVms = @('myVM1','myVM2','myVM3',)

foreach ($vm in $allVms)
{
    if ($vm -eq 'myVM2')
    {
        New-AzVm @commonParams -Name $vm -Location "West US"
    }
    else
    {
        New-AzVm @commonParams -Name $vm
    }
}

Ejemplo 4: Uso de varios objetos de placa en un solo comando

Puede usar varios objetos de placa en un solo comando. En este ejemplo, se definen distintos parámetros en tablas hash independientes. Las tablas hash se dividen en un solo Write-Host comando.

$a = @{
    Message         = 'Hello', 'World!'
}
$b = @{
    Separator       = '|'
}
$c = @{
    BackgroundColor = 'Cyan'
    ForegroundColor = 'Black'
}
Write-Host @a @b @c

Parámetros de comando de expansión

Puede usar la expansión para representar los parámetros de un comando. Esta técnica es útil cuando se crea una función de proxy, es decir, una función que llama a otro comando. Esta característica se introduce en Windows PowerShell 3.0.

Para expandir los parámetros de un comando, use @Args para representar los parámetros de comando. Esta técnica es más fácil que enumerar los parámetros de comando y funciona sin revisión aunque los parámetros del comando llamado cambien.

La característica usa la $Args variable automática, que contiene todos los valores de parámetro sin asignar.

Por ejemplo, la siguiente función llama al Get-Process cmdlet . En esta función, @Args representa todos los parámetros del Get-Process cmdlet.

function Get-MyProcess { Get-Process @Args }

Cuando se usa la Get-MyProcess función , todos los parámetros sin asignar y los valores de parámetro se pasan a @Args, como se muestra en los comandos siguientes.

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\...

Puede usar @Args en una función que haya declarado explícitamente parámetros. Puede usarlo más de una vez en una función, pero todos los parámetros que escriba se pasan a todas las instancias de @Args, como se muestra en el ejemplo siguiente.

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

Get-MyCommand -P -C -Name PowerShell
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     50   112.76      78.52      16.64    6880   1 powershell

Path               : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Extension          : .exe
Definition         : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Source             : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Version            : 10.0.22621.3085
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.22621.1 (WinBuild.160101.0800)
                     FileDescription:  Windows PowerShell
                     Product:          Microsoft&reg; Windows&reg; Operating System
                     ProductVersion:   10.0.22621.1
                     Debug:            False
                     Patched:          False
                     PreRelease:       False
                     PrivateBuild:     False
                     SpecialBuild:     False
                     Language:         English (United States)

Notas

Si crea una función en una función avanzada mediante los atributos CmdletBinding o Parameter , la $args variable automática ya no está disponible en la función. Las funciones avanzadas requieren una definición de parámetro explícita.

PowerShell Desired State Configuration (DSC) no se diseñó para usar la expansión. No se puede usar la expansión para pasar valores a un recurso de DSC. Para obtener más información, consulte el artículo pseudoesplatando recursos de DSC de Gael Colas.

Consulte también