Jak przekonwertować obiekt tablicy na ciąg w programie PowerShell?

175

Jak mogę przekonwertować obiekt tablicy na ciąg?

Próbowałem:

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

bez szczęścia . Jakie są różne możliwości w PowerShell?

jrara
źródło
5
Zobacz moją odpowiedź, ale twój kod też działa dobrze. Dlaczego mówisz „bez szczęścia”?
Roman Kuzmin
4
Przepraszam, tak, wydaje się, że działa, myślę, że coś schrzaniłem, kiedy to testowałem.
jrara,

Odpowiedzi:

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

Używanie cudzysłowów (i opcjonalnie separatora $ofs)

# This Is a cat
"$a"

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

Korzystanie z łączenia operatorów

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

# ThisIsacat
-join $a

Korzystanie z konwersji do [string]

# This Is a cat
[string]$a

# This-Is-a-cat
$ofs = '-'
[string]$a
Roman Kuzmin
źródło
9
Dla niewtajemniczonych (takich jak ja) $ofsjest udokumentowane tutaj
Liam
13
Dokumentacja Stackoverflow została zamknięta, więc łącze Liama ​​nie działa. Oto kolejne wyjaśnienie $ OFS, separatora pól wyjściowych: blogs.msdn.microsoft.com/powershell/2006/07/15/ ...
Simon Tewsi,
Dlaczego nazywa się OFS? To dziwna nazwa, biorąc pod uwagę, że od dziesięcioleci nazywa się IFS na standardowej powłoce.
Johan Boulé
1
@ JohanBoulé: Ponieważ użycie pierwszego znaku separatora pól wejściowych jako separatora pól wyjściowych to paskudna sztuczka - i nie pozwala na oddzielanie pól ciągami wieloznakowymi. (Na przykład Awk ma zmienne FS i OFS).
Martin Bonner wspiera Monikę
@martin bonner: dzięki, teraz ma to sens. Nie wiem, jak to schrzaniłem.
Johan Boulé,
36

Okazało się, że przekierowanie tablicy do polecenia Out-Stringcmdlet również działa dobrze.

Na przykład:

PS C:\> $a  | out-string

This
Is
a
cat

To zależy od celu końcowego, która metoda jest najlepsza w użyciu.

Jeremy Saunders
źródło
4
Do Twojej wiadomości: po prostu zrobienie $atego miałoby taki sam efekt jak$a | out-string
JohnLBevan
7
@JohnLBevan Nie zawsze. ($a | out-string).getType()= Ciąg. $a.getType()= Obiekt []. Jeśli używasz $ a jako argumentu w metodzie oczekującej łańcucha ( invoke-expressionna przykład), $a | out-stringma to wyraźną przewagę.
rojo
18
1> $a = "This", "Is", "a", "cat"

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

Linia druga wykonuje operację i wyprowadza do hosta, ale nie modyfikuje $ a:

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

4> $a

This Is a cat

5> $a.Count

1
TCC
źródło
10

Z rury

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

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

Host zapisu

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

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

Przykład

Steven Penny
źródło
To niesamowita sztuczka. Przykład już nie działa i chociaż ta odpowiedź ma 5 lat, staram się wyjaśnić, czego się dzisiaj nauczyłem. $ofsJest Output Field Separatorzmienny, który jest stosowany, gdy matryca jest przekształcany łańcucha wyjścia. Tutaj jest ustawiana w bloku skryptu, zwracając wartość ciągu wejściowego (tablica z potoku), która jest wykonywana przez polecenie &. Nie wiedziałem o tym $ofswcześniej, a także o &przyjęciu bloku skryptu jako argumentu
Martin Konopka
3

Możesz określić typ w ten sposób:

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

Sprawdzanie typu:

$a.GetType()

Potwierdza:

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

Wyprowadzanie $ a:

PS C: \> $ a 
To 
Jest 
za 
kot
Ameer Deen
źródło
0
$a = "This", "Is", "a", "cat"

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

Write-Host $sent
Underverse
źródło