2016-10-14 7 views
2

Dies wird sicherlich leicht für jemanden sein. Wenn ich ein Array-Element in einer Zeichenfolge referenziere, erzeugt es nicht das gewünschte Ergebnis. Ich erwartete, dass die letzte Anweisung eine Zeichenfolge mit "abc" erzeugt, aber das tut sie nicht.So erweitern (interpolieren) Sie ein Array-Element in einer Zeichenfolge

PS C:\src\powershell> $mylist = @("abc", "def") 
PS C:\src\powershell> $mylist 
abc 
def 
PS C:\src\powershell> $mylist[0] 
abc 
PS C:\src\powershell> $mylist[1] 
def 
PS C:\src\powershell> "$mylist[0]" 
abc def[0]s 

Antwort

3

Hinweis: Während diese Antwort viele Aspekte der String-Interpolation in Powershell, eine umfassendere Behandlung dieses Thema behandelt in this answer von mir zu finden.

Wenn Variablenreferenzen in Strings in doppelten Anführungszeichen einbetten, nur einfache Variablenreferenzen können $(...) in dem sogenannten subexpression Operator, ohne umschließenden den Ausdruck eingebettet werden:

> $mylist = @("abc", "def") # define an array 

> "$mylist[0]" # WRONG: $mylist (the whole array) is expanded, and "[0]" is a literal. 
abc def[0] 

> "$($mylist[0])" # OK: $(...) ensures that the subscript is recognized. 
abc 

zu sein genauer, können Sie direkt einbetten die folgenden variablen Referenzen in double-quot ed strings/here-Zeichenfolgen um sie erweitert zu haben (interpoliert):

  • eine Variable nur namentlich verwiesen; z. B. "I'm $HOME."
  • eine Variable mit einem Scope-Spezifizierer; z.B. "I'm on a spiritual $env:PATH."

Um Disambiguieren ein Variablenname von nachfolgenden Zeichen, sie umschließen in {...}; z. B.
"I'm ${HOME}:"
Beachten Sie, dass ohne {...} die endgültige : als Teil des Variablennamens interpretiert worden wäre und einen Fehler verursacht hätte.
Alternativ können Sie die : als `: und ähnlich zu entkommen, Verwendung `$ zu entkommen (erstellen wörtliche) $.

Für alles andere, einschließlich Zugriff auf ein Index der Array-Variable oder eine Objekt Variable Eigenschaft, müssen Sie die subexpression Operator, $(...).
Hinweis: $(...) können Sie gesamte Befehlszeilen in einer Zeichenfolge einbetten; z.B.:

> "Today is $((Get-Date).ToString('d'))." 
Today is 10/13/16.       # en-US culture 

Dokumentation Hinweis: Get-Help about_Quoting_Rules umfasst String-Interpolation, aber, wie von pSV5, nicht in der Tiefe.


Für Alternativen zu String-Interpolation (Expansion) für Streicher Gebäude finden Ansgar Wiecher's answer.

1

PowerShell erkennt komplexere Variablenkonstrukte (z. B. Indexoperationen ($mylist[0]) oder Eigenschaften-/Methodenzugriff ($mylist.Count)) nicht, wenn Variablen in Zeichenfolgen erweitert werden. Es wird einfach die Variable erweitern und den Rest der Zeichenfolge in Ruhe lassen. Daher wird der Ausdruck "$mylist[0]""abc def[0]".

Grundsätzlich haben Sie drei Möglichkeiten mit dieser Einschränkung umgehen:

  • Verwenden Sie ein subexpression:

    "-$($mylist[0])-" 
    
  • Verwenden der format operator:

    "-{0}-" -f $mylist[0] 
    
  • Verwenden String-Verkettung:

    "-" + $mylist[0] + "-" 
    

Natürlich gibt es auch "exotischere" Ansätze, wie mit dem -join Betreiber:

"-", $mylist[0], "-" -join "" 

oder Ersatzoperationen:

'-%x%-' -replace '%x%', $mylist[0] 
'-%x%-'.Replace('%x%', $mylist[0]) 

Diejenigen aber, schon kurz davor auf Verschleierungs .

Verwandte Themen