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?


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

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.


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

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


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

0
$a = "This", "Is", "a", "cat"

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

Write-Host $sent
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.