¿Qué hace el símbolo "@" en Powershell?

112

He visto el símbolo @ utilizado en PowerShell para inicializar matrices. ¿Qué indica exactamente el símbolo @ y dónde puedo leer más al respecto?

GrahamMc
fuente

Respuestas:

81

PowerShell realmente tratará cualquier lista separada por comas como una matriz:

"server1","server2"

Entonces @ es opcional en esos casos. Sin embargo, para matrices asociativas, se requiere @:

@{"Key"="Value";"Key2"="Value2"}

Oficialmente, @ es el "operador de matriz". Puede leer más sobre esto en la documentación que se instaló junto con PowerShell, o en un libro como "Windows PowerShell: TFM", del cual soy coautor.

Don Jones
fuente
12
Asegúrese de revisar la respuesta de Jeffrey Snover a continuación ... @ es más que un identificador de matriz.
Eric Schoonover
115

En PowerShell V2, @ también es el operador de Splat .

PS> # First use it to create a hashtable of parameters:
PS> $params = @{path = "c:\temp"; Recurse= $true}
PS> # Then use it to SPLAT the parameters - which is to say to expand a hash table 
PS> # into a set of command line parameters.
PS> dir @params
PS> # That was the equivalent of:
PS> dir -Path c:\temp -Recurse:$true
Jeffrey Snover - MSFT
fuente
1
Esto es lo que estaba buscando: este operador se usa en el contexto de splat en los scripts de implementación de Azure Resource Group.
Alex Marshall
57

Si bien las respuestas anteriores proporcionan la mayor parte de la respuesta, es útil, incluso tan tarde para la pregunta, proporcionar la respuesta completa, a saber:

Subexpresión de matriz (consulte about_arrays )

Obliga al valor a ser una matriz, incluso si es un singleton o un nulo, por ejemplo $a = @(ps | where name -like 'foo')

Inicializador de hash (consulte about_hash_tables )

Inicializa una tabla hash con pares clave-valor, p. Ej. $HashArguments = @{ Path = "test.txt"; Destination = "test2.txt"; WhatIf = $true }

Salpicaduras (ver about_splatting )

Vamos a invocar un cmdlet con parámetros de una matriz o una tabla hash en lugar de los parámetros enumerados individualmente más habituales, por ejemplo, utilizando la tabla hash justo arriba, Copy-Item @HashArguments

Aquí cadenas (ver about_quoting_rules )

Vamos a crear cadenas con comillas fácilmente incrustadas, normalmente utilizadas para cadenas de varias líneas, por ejemplo:

$data = @"
line one
line two
something "quoted" here
"@

Debido a que este tipo de pregunta ( ¿qué significa la notación 'x' en PowerShell? ) Es tan común aquí en StackOverflow, así como en muchos comentarios de lectores, reuní un léxico de puntuación de PowerShell, recién publicado en Simple-Talk.com. Lea todo sobre @, así como% y # y $ _ y? y más en The Complete Guide to PowerShell Punctuation . Adjunto al artículo se encuentra este gráfico mural que le brinda todo en una sola hoja: ingrese la descripción de la imagen aquí

Michael Sorens
fuente
Recorrido muy completo de todos los usos de @. Vine aquí buscando la cadena aquí. ¡Gracias!
Nixphoe
27

También puede ajustar la salida de un cmdlet (o canalización) @()para asegurarse de que lo que obtenga sea una matriz en lugar de un solo elemento.

Por ejemplo, dir generalmente devuelve una lista, pero dependiendo de las opciones, puede devolver un solo objeto. Si planea iterar a través de los resultados con un objeto foreach, debe asegurarse de obtener una lista. Aquí hay un ejemplo artificial:

$results = @( dir c:\autoexec.bat)

Una cosa más ... se denota una matriz vacía (como para inicializar una variable) @().

Mike Shepard
fuente
La sintaxis de [array] $ a es algo más clara, visualmente, pero un buen consejo.
Don Jones