Cosa fa il simbolo "@" in Powershell?


112

Ho visto il simbolo @ utilizzato in PowerShell per inizializzare gli array. Che cosa indica esattamente il simbolo @ e dove posso leggere di più al riguardo?

Risposte:


81

PowerShell tratterà effettivamente qualsiasi elenco separato da virgole come un array:

"server1","server2"

Quindi la @ è facoltativa in questi casi. Tuttavia, per gli array associativi, il simbolo @ è obbligatorio:

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

Ufficialmente, @ è l '"operatore di matrice". Puoi leggere ulteriori informazioni al riguardo nella documentazione installata insieme a PowerShell o in un libro come "Windows PowerShell: TFM", di cui sono coautore.


12
Assicurati di controllare la risposta di Jeffrey Snover di seguito ... @ è più di un semplice identificatore di array.
Eric Schoonover

115

In PowerShell V2, @ è anche l' operatore 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

1
Questo è quello che stavo cercando: questo operatore viene utilizzato nel contesto splat negli script di distribuzione di Azure Resource Group.
Alex Marshall

57

Sebbene le risposte di cui sopra forniscano la maggior parte della risposta, è utile, anche così tardi alla domanda, fornire la risposta completa, ovvero:

Sottoespressione array (vedere about_arrays )

Forza il valore a essere un array, anche se singleton o null, ad es $a = @(ps | where name -like 'foo')

Inizializzatore hash (vedi about_hash_tables )

Inizializza una tabella hash con coppie chiave-valore, ad es $HashArguments = @{ Path = "test.txt"; Destination = "test2.txt"; WhatIf = $true }

Splatting (vedi about_splatting )

Consente di richiamare un cmdlet con parametri da un array o da una tabella hash anziché i parametri enumerati individualmente più consueti, ad esempio utilizzando la tabella hash appena sopra, Copy-Item @HashArguments

Qui stringhe (vedi about_quoting_rules )

Consente di creare stringhe con virgolette facilmente incorporate, tipicamente utilizzate per stringhe su più righe, ad esempio:

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

Poiché questo tipo di domanda ( cosa significa la notazione "x" in PowerShell? ) È così comune qui su StackOverflow e in molti commenti dei lettori, ho messo insieme un lessico di punteggiatura di PowerShell, appena pubblicato su Simple-Talk.com. Leggi tutto su @ così come% e # e $ _ e? e altro ancora in The Complete Guide to PowerShell Punctuation . In allegato all'articolo c'è questo wallchart che ti dà tutto su un unico foglio: inserisci qui la descrizione dell'immagine


Esame molto approfondito di tutti gli usi di @. Sono venuto qui a cercare la stringa qui. Grazie!
Nixphoe

27

È inoltre possibile eseguire il wrapping dell'output di un cmdlet (o pipeline) @()per assicurarsi che ciò che si ottiene sia una matrice anziché un singolo elemento.

Ad esempio, dir di solito restituisce un elenco, ma a seconda delle opzioni, potrebbe restituire un singolo oggetto. Se stai pianificando di iterare i risultati con un oggetto foreach, devi assicurarti di recuperare un elenco. Ecco un esempio artificioso:

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

Un'altra cosa ... viene indicato un array vuoto (come inizializzare una variabile) @().


[array] $ a sintassi è un po 'più chiara, visivamente, ma un buon suggerimento.
Don Jones

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.