Bagaimana cara mengonversi objek array ke string di PowerShell?

175

Bagaimana saya bisa mengkonversi objek array ke string?

Saya mencoba:

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

tanpa keberuntungan . Apa saja kemungkinan yang berbeda di PowerShell?

jrara
sumber
5
Lihat jawaban saya tetapi kode Anda juga berfungsi dengan baik. Mengapa Anda mengatakan "tanpa keberuntungan"?
Roman Kuzmin
4
Maaf, ya, sepertinya berhasil, saya pikir saya mengacaukan sesuatu ketika saya menguji ini.
jrara

Jawaban:

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

Menggunakan tanda kutip ganda (dan secara opsional menggunakan pemisah $ofs)

# This Is a cat
"$a"

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

Menggunakan operator bergabung

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

# ThisIsacat
-join $a

Menggunakan konversi ke [string]

# This Is a cat
[string]$a

# This-Is-a-cat
$ofs = '-'
[string]$a
Roman Kuzmin
sumber
9
Untuk yang belum diinisiasi (seperti saya) $ofsdidokumentasikan di sini
Liam
13
Dokumentasi Stackoverflow telah ditutup sehingga tautan Liam mati. Berikut penjelasan lain dari $ OFS, Output Field Separator: blogs.msdn.microsoft.com/powershell/2006/07/15/…
Simon Tewsi
Mengapa disebut OFS? Itu nama yang aneh mengingat itu disebut IFS pada shell standar selama beberapa dekade dan dekade.
Johan Boulé
1
@ JohanBoulé: Karena menggunakan karakter pertama dari Pemisah Bidang Input sebagai Pemisah Bidang Output adalah peretasan yang buruk - dan tidak mengizinkan pemisahan bidang dengan string multi-karakter. (Awk misalnya memiliki variabel FS dan OFS).
Martin Bonner mendukung Monica
@martin bonner: terima kasih, itu masuk akal sekarang. Saya tidak tahu bagaimana saya mengacaukan ini.
Johan Boulé
36

Saya menemukan bahwa mem-pipe array ke Out-Stringcmdlet juga berfungsi dengan baik.

Sebagai contoh:

PS C:\> $a  | out-string

This
Is
a
cat

Tergantung pada tujuan akhir Anda, metode mana yang terbaik untuk digunakan.

Jeremy Saunders
sumber
4
FYI: hanya melakukan $aakan memiliki efek yang sama seperti$a | out-string
JohnLBevan
7
@ JohnLBevan Tidak selalu. ($a | out-string).getType()= String. $a.getType()= Obyek []. Jika Anda menggunakan $ a sebagai argumen untuk metode yang mengharapkan string (seperti invoke-expressionmisalnya), maka $a | out-stringmemiliki keuntungan yang jelas.
rojo
18
1> $a = "This", "Is", "a", "cat"

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

Baris dua melakukan operasi dan output untuk menjadi tuan rumah, tetapi tidak mengubah $ a:

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

4> $a

This Is a cat

5> $a.Count

1
TCC
sumber
10

Dari pipa

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

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

Tuan Rumah Penulis

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

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

Contoh

Steven Penny
sumber
Ini adalah trik yang luar biasa. Contoh itu tidak berfungsi lagi, dan walaupun jawaban ini 5 tahun, saya mencoba menjelaskan apa yang saya pelajari hari ini. The $ofsadalah Output Field Separatorvariabel yang digunakan ketika sebuah array diubah menjadi string output. Di sini diatur di blok skrip mengembalikan nilai string dari input (array dari pipa) yang dieksekusi oleh perintah &. Saya tidak tahu tentang $ofssebelumnya, serta &menerima blok skrip sebagai argumen
Martin Konopka
3

Anda dapat menentukan jenis seperti ini:

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

Memeriksa jenisnya:

$a.GetType()

Mengkonfirmasikan:

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

Menghasilkan $ a:

PS C: \> $ a 
Ini 
Adalah 
Sebuah 
kucing
Ameer Deen
sumber
0
$a = "This", "Is", "a", "cat"

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

Write-Host $sent
Bawah
sumber