Wie konvertiere ich ein Array-Objekt in eine Zeichenfolge in PowerShell?

175

Wie kann ich ein Array-Objekt in einen String konvertieren?

Ich habe es versucht:

$a = "This", "Is", "a", "cat"
[system.String]::Join(" ", $a)

ohne Glück . Welche unterschiedlichen Möglichkeiten bietet PowerShell?

jrara
quelle
5
Siehe meine Antwort, aber Ihr Code funktioniert auch einwandfrei. Warum sagst du "ohne Glück"?
Roman Kuzmin
4
Sorry, ja, es scheint zu funktionieren, ich glaube, ich habe etwas durcheinander gebracht, als ich das getestet habe.
Jrara

Antworten:

294
$a = 'This', 'Is', 'a', 'cat'

Verwenden Sie doppelte Anführungszeichen (und verwenden Sie optional das Trennzeichen $ofs)

# This Is a cat
"$a"

# This-Is-a-cat
$ofs = '-' # after this all casts work this way until $ofs changes!
"$a"

Verwenden von Operator Join

# This-Is-a-cat
$a -join '-'

# ThisIsacat
-join $a

Konvertierung nach verwenden [string]

# This Is a cat
[string]$a

# This-Is-a-cat
$ofs = '-'
[string]$a
Roman Kuzmin
quelle
9
Denn der Uneingeweihte (wie ich) $ofsist hier
Liam
13
Die Stackoverflow-Dokumentation wurde heruntergefahren, sodass Liams Link nicht mehr funktioniert. Hier ist eine weitere Erklärung von $ OFS, dem Ausgabefeldtrennzeichen: blogs.msdn.microsoft.com/powershell/2006/07/15/…
Simon Tewsi
Warum heißt es OFS? Es ist ein seltsamer Name, wenn man bedenkt, dass er seit Jahrzehnten IFS auf Standard-Shell heißt.
Johan Boulé
1
@ JohanBoulé: Weil die Verwendung des ersten Zeichens des Eingabefeldtrenners als Ausgabefeldtrennzeichen ein böser Hack ist - und das Trennen von Feldern mit Zeichenfolgen mit mehreren Zeichen nicht zulässt. (Awk hat zum Beispiel FS- und OFS-Variablen).
Martin Bonner unterstützt Monica
@martin bonner: danke, es macht jetzt sinn. Ich weiß nicht, wie ich das vermasselt habe.
Johan Boulé
36

Ich fand, dass das Out-StringWeiterleiten des Arrays an das Cmdlet auch gut funktioniert.

Beispielsweise:

PS C:\> $a  | out-string

This
Is
a
cat

Es hängt von Ihrem Endziel ab, welche Methode am besten geeignet ist.

Jeremy Saunders
quelle
4
Zu $a$a | out-string
Ihrer Information
7
@ JohnLBevan Nicht immer. ($a | out-string).getType()= String. $a.getType()= Objekt []. Wenn Sie $ a als Argument für eine Methode verwenden, die eine Zeichenfolge erwartet (z. invoke-expressionB.), $a | out-stringhat dies einen klaren Vorteil.
Rojo
18
1> $a = "This", "Is", "a", "cat"

2> [system.String]::Join(" ", $a)

Zeile zwei führt die Operation aus und gibt sie an den Host aus, ändert jedoch nicht $ a:

3> $a = [system.String]::Join(" ", $a)

4> $a

This Is a cat

5> $a.Count

1
TCC
quelle
10

Aus einem Rohr

# This Is a cat
'This', 'Is', 'a', 'cat' | & {"$input"}

# This-Is-a-cat
'This', 'Is', 'a', 'cat' | & {$ofs='-';"$input"}

Write-Host

# This Is a cat
Write-Host 'This', 'Is', 'a', 'cat'

# This-Is-a-cat
Write-Host -Separator '-' 'This', 'Is', 'a', 'cat'

Beispiel

Steven Penny
quelle
Das ist ein erstaunlicher Trick. Das Beispiel funktioniert nicht mehr und obwohl diese Antwort 5 Jahre alt ist, versuche ich zu erklären, was ich heute gelernt habe. Das $ofsist Output Field SeparatorVariable , die verwendet wird , wenn ein Array in Zeichenfolge für die Ausgabe umgewandelt wird. Hier wird es im Skriptblock festgelegt, der den Zeichenfolgenwert der Eingabe (Array aus der Pipe) zurückgibt, die vom Befehl ausgeführt wird &. Ich wusste $ofsvorher nichts darüber und &akzeptierte einen Skriptblock als Argument
Martin Konopka
3

Sie können den folgenden Typ angeben:

[string[]] $a = "This", "Is", "a", "cat"

Überprüfen des Typs:

$a.GetType()

Bestätigt:

    IsPublic IsSerial Name BaseType
    -------- -------- ---- --------
    True True String [] System.Array

Ausgabe von $ a:

PS C: \> $ a 
Dies 
Ist 
ein 
Katze
Ameer Deen
quelle
0
$a = "This", "Is", "a", "cat"

foreach ( $word in $a ) { $sent = "$sent $word" }
$sent = $sent.Substring(1)

Write-Host $sent
Underverse
quelle