O que o símbolo “@” faz no Powershell?

112

Eu vi o símbolo @ usado no PowerShell para inicializar arrays. O que exatamente o símbolo @ denota e onde posso ler mais sobre isso?

GrahamMc
fonte

Respostas:

82

O PowerShell realmente tratará qualquer lista separada por vírgulas como uma matriz:

"server1","server2"

Portanto, o @ é opcional nesses casos. No entanto, para matrizes associativas, o @ é obrigatório:

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

Oficialmente, @ é o "operador de matriz". Você pode ler mais sobre isso na documentação que foi instalada junto com o PowerShell ou em um livro como "Windows PowerShell: TFM", do qual fui coautor.

Don Jones
fonte
12
Certifique-se de verificar a resposta de Jeffrey Snover abaixo ... @ é mais do que apenas um identificador de array.
Eric Schoonover,
115

No PowerShell V2, @ também é o operador 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
fonte
1
Isso é o que eu estava procurando: esse operador é usado no contexto splat nos scripts de implantação do Grupo de Recursos do Azure.
Alex Marshall
57

Embora as respostas acima forneçam a maior parte da resposta, é útil - mesmo tão tarde para a pergunta - fornecer a resposta completa, a saber:

Subexpressão de matriz (consulte about_arrays )

Força o valor a ser uma matriz, mesmo se um singleton ou nulo, por exemplo $a = @(ps | where name -like 'foo')

Inicializador de hash (consulte about_hash_tables )

Inicializa uma tabela hash com pares de valores-chave, por exemplo $HashArguments = @{ Path = "test.txt"; Destination = "test2.txt"; WhatIf = $true }

Splatting (consulte about_splatting )

Vamos invocar um cmdlet com parâmetros de uma matriz ou uma tabela hash em vez dos parâmetros enumerados individualmente mais comuns, por exemplo, usando a tabela hash logo acima, Copy-Item @HashArguments

Aqui, strings (veja about_quoting_rules )

Vamos criar strings com aspas facilmente incorporadas, normalmente usadas para strings multilinhas, por exemplo:

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

Como esse tipo de pergunta ( o que a notação 'x' significa no PowerShell? ) É tão comum aqui no StackOverflow, bem como em muitos comentários de leitores, eu reuni um léxico de pontuação do PowerShell, recém-publicado no Simple-Talk.com. Leia tudo sobre @, bem como% e # e $ _ e? e mais em The Complete Guide to PowerShell Punctuation . Anexado ao artigo está este gráfico de parede que mostra tudo em uma única folha: insira a descrição da imagem aqui

Michael Sorens
fonte
Percurso muito completo de todos os usos de @. Vim aqui procurando o barbante. Obrigado!
Nixphoe
27

Você também pode envolver a saída de um cmdlet (ou pipeline) @()para garantir que o que você receberá de volta seja uma matriz em vez de um único item.

Por exemplo, dir geralmente retorna uma lista, mas dependendo das opções, pode retornar um único objeto. Se você está planejando iterar pelos resultados com um objeto foreach, você precisa ter certeza de obter uma lista de volta. Aqui está um exemplo inventado:

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

Mais uma coisa ... um array vazio (como inicializar uma variável) é denotado @().

Mike Shepard
fonte
[array] $ a sintaxe é um pouco mais clara, visualmente, mas uma boa dica.
Don Jones