Co robi symbol „@” w programie PowerShell?

112

Widziałem symbol @ używany w PowerShell do inicjowania tablic. Co dokładnie oznacza symbol @ i gdzie mogę dowiedzieć się więcej na ten temat?

GrahamMc
źródło

Odpowiedzi:

82

PowerShell faktycznie potraktuje każdą listę oddzieloną przecinkami jako tablicę:

"server1","server2"

W takich przypadkach znak @ jest opcjonalny. Jednak w przypadku tablic asocjacyjnych znak @ jest wymagany:

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

Oficjalnie @ jest „operatorem tablicy”. Możesz przeczytać więcej na ten temat w dokumentacji zainstalowanej wraz z PowerShell lub w książce takiej jak „Windows PowerShell: TFM”, której jestem współautorem.

Don Jones
źródło
12
Koniecznie sprawdź odpowiedź Jeffreya Snovera poniżej ... @ to coś więcej niż tylko identyfikator tablicy.
Eric Schoonover,
115

W PowerShell V2 @ jest także operatorem 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
źródło
1
Właśnie tego szukałem: ten operator jest używany w kontekście splat w skryptach wdrażania Azure Resource Group.
Alex Marshall
57

Chociaż powyższe odpowiedzi dostarczają większości odpowiedzi, warto - nawet tak późno w kwestii pytania - udzielić pełnej odpowiedzi, a mianowicie:

Wyrażenie podrzędne tablicy (zobacz about_arrays )

Wymusza, aby wartość była tablicą, nawet jeśli jest to singleton lub null, np $a = @(ps | where name -like 'foo')

Inicjator skrótu (zobacz about_hash_tables )

Inicjuje tablicę skrótów z parami klucz-wartość, np $HashArguments = @{ Path = "test.txt"; Destination = "test2.txt"; WhatIf = $true }

Splatting (zobacz about_splatting )

Wywołajmy cmdlet z parametrami z tablicy lub tablicy skrótów zamiast bardziej zwyczajowych indywidualnie wyliczanych parametrów, np. Używając tabeli skrótów powyżej, Copy-Item @HashArguments

Tutaj ciągi (zobacz about_quoting_rules )

Utwórzmy ciągi z łatwymi do osadzania cudzysłowami, zwykle używanymi w przypadku ciągów wieloliniowych, np .:

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

Ponieważ tego typu pytanie ( co oznacza notacja `` x '' w PowerShell? ) Jest tak powszechne w StackOverflow, a także w wielu komentarzach czytelników, przygotowałem leksykon interpunkcji PowerShell, właśnie opublikowany na Simple-Talk.com. Przeczytaj wszystko o @, a także o% i # oraz $ _ i? i nie tylko w Pełnym przewodniku po interpunkcji programu PowerShell . Do artykułu dołączony jest poniższy wykres, który zawiera wszystko na jednym arkuszu: wprowadź opis obrazu tutaj

Michael Sorens
źródło
Bardzo dokładne omówienie wszystkich zastosowań @. Przyszedłem tutaj, szukając tutaj-sznurka. Dziękuję Ci!
Nixphoe
27

Możesz również zawinąć dane wyjściowe polecenia cmdlet (lub potoku), @()aby upewnić się, że otrzymujesz tablicę, a nie pojedynczy element.

Na przykład dir zwykle zwraca listę, ale w zależności od opcji może zwrócić pojedynczy obiekt. Jeśli planujesz iterację wyników z każdym obiektem, musisz upewnić się, że otrzymałeś listę z powrotem. Oto wymyślony przykład:

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

Jeszcze jedno ... pusta tablica (jak inicjalizacja zmiennej) jest oznaczona @().

Mike Shepard
źródło
[tablica] $ składnia jest nieco bardziej przejrzysta wizualnie, ale dobra wskazówka.
Don Jones