Was macht das @ -Symbol in Powershell?

112

Ich habe das @ -Symbol gesehen, das in PowerShell zum Initialisieren von Arrays verwendet wird. Was genau bedeutet das @ -Symbol und wo kann ich mehr darüber lesen?

GrahamMc
quelle

Antworten:

81

PowerShell behandelt jede durch Kommas getrennte Liste tatsächlich als Array:

"server1","server2"

In diesen Fällen ist das @ optional. Für assoziative Arrays ist jedoch das @ erforderlich:

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

Offiziell ist @ der "Array-Operator". Weitere Informationen finden Sie in der Dokumentation, die zusammen mit PowerShell installiert wurde, oder in einem Buch wie "Windows PowerShell: TFM", das ich mitautorisiert habe.

Don Jones
quelle
12
Lesen Sie die Antwort von Jeffrey Snover weiter unten ... @ ist mehr als nur eine Array-ID.
Eric Schoonover
115

In PowerShell V2 ist @ auch der Splat-Operator .

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
quelle
1
Dies ist, wonach ich gesucht habe: Dieser Operator wird im Splat-Kontext in Azure Resource Group-Bereitstellungsskripten verwendet.
Alex Marshall
57

Während die obigen Antworten den größten Teil der Antwort liefern , ist es nützlich - auch so spät auf die Frage -, die vollständige Antwort zu geben, nämlich:

Array-Unterausdruck (siehe about_arrays )

Erzwingt, dass der Wert ein Array ist, selbst wenn ein Singleton oder eine Null, z $a = @(ps | where name -like 'foo')

Hash-Initialisierer (siehe about_hash_tables )

Initialisiert eine Hash-Tabelle mit Schlüssel-Wert-Paaren, z $HashArguments = @{ Path = "test.txt"; Destination = "test2.txt"; WhatIf = $true }

Splatting (siehe about_splatting )

Lassen Sie uns ein Cmdlet mit Parametern aus einem Array oder einer Hash-Tabelle aufrufen, anstatt den üblicheren, einzeln aufgezählten Parametern, z. B. mithilfe der obigen Hash-Tabelle. Copy-Item @HashArguments

Hier Zeichenfolgen (siehe about_quoting_rules )

Lassen Sie uns Zeichenfolgen mit einfach eingebetteten Anführungszeichen erstellen, die normalerweise für mehrzeilige Zeichenfolgen verwendet werden, z.

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

Da diese Art von Frage ( was bedeutet "x" -Notation in PowerShell? ) Hier in StackOverflow sowie in vielen Leserkommentaren so häufig vorkommt, habe ich ein Lexikon mit PowerShell-Interpunktion zusammengestellt, das gerade auf Simple-Talk.com veröffentlicht wurde. Lesen Sie alles über @ sowie% und # und $ _ und? und mehr unter The Complete Guide to PowerShell Punctuation . Dem Artikel ist dieses Wallchart beigefügt, das Ihnen alles auf einem einzigen Blatt bietet: Geben Sie hier die Bildbeschreibung ein

Michael Sorens
quelle
Sehr gründlicher Überblick über alle Verwendungszwecke von @. Ich bin hierher gekommen, um nach der Hier-Saite zu suchen. Danke dir!
Nixphoe
27

Sie können auch die Ausgabe eines Cmdlets (oder einer Pipeline) einschließen, @()um sicherzustellen, dass Sie ein Array und kein einzelnes Element erhalten.

Beispielsweise gibt dir normalerweise eine Liste zurück, aber abhängig von den Optionen wird möglicherweise ein einzelnes Objekt zurückgegeben. Wenn Sie vorhaben, die Ergebnisse mit einem foreach-Objekt zu durchlaufen, müssen Sie sicherstellen, dass Sie eine Liste zurückerhalten. Hier ist ein erfundenes Beispiel:

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

Eine weitere Sache ... ein leeres Array (wie das Initialisieren einer Variablen) wird bezeichnet @().

Mike Shepard
quelle
[array] $ a Syntax ist visuell etwas klarer, aber ein guter Tipp.
Don Jones