PowerShellで配列オブジェクトを文字列に変換するにはどうすればよいですか?


175

配列オブジェクトを文字列に変換するにはどうすればよいですか?

私は試した:

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

運が悪い。PowerShellにはどのような可能性がありますか?


5
私の答えを見てくださいが、あなたのコードもうまくいきます。なぜ「運が悪い」と言うのですか?
ローマン・クズミン

4
申し訳ありませんが、はい、動作するようです。私がこれをテストしたとき、私は何かを台無しにしたと思います。
jrara

回答:


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

二重引用符の使用(およびオプションで区切り記号を使用$ofs

# This Is a cat
"$a"

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

演算子結合の使用

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

# ThisIsacat
-join $a

変換を使用して [string]

# This Is a cat
[string]$a

# This-Is-a-cat
$ofs = '-'
[string]$a

9
$ofs
Liam

13
Stackoverflowのドキュメントがシャットダウンされたため、Liamのリンクは無効になっています。$ OFSの別の説明は、出力フィールドセパレーターです。blogs.msdn.microsoft.com
Simon Tewsi 2017年

なぜOFSと呼ばれるのですか?これは、何十年もの間標準シェルでIFSと呼ばれていたことを考えると、奇妙な名前です。
JohanBoulé18年

1
@JohanBoulé:入力フィールドセパレーターの最初の文字を出力フィールドセパレーターとして使用するのは厄介なハックであり、複数文字の文字列でフィールドを分離することはできません。(たとえばawkにはFS変数とOFS変数があります)。
Martin Bonnerはモニカの

@martin bonner:ありがとう、それは今では理にかなっています。どうやってこれをめちゃくちゃにしたのか分かりません。
JohanBoulé2018

36

配列をOut-Stringコマンドレットにパイプすることもうまくいくことがわかりました。

例えば:

PS C:\> $a  | out-string

This
Is
a
cat

どの方法が最適であるかは、最終目標によって異なります。


4
参考までに:ちょうど行う$aことと同じ効果があります$a | out-string
JohnLBevan 2014年

7
@JohnLBevanいつもとは限りません。 ($a | out-string).getType()=文字列。 $a.getType()= Object []。文字列を期待するメソッド(invoke-expressionたとえば)の引数として$ aを使用している場合$a | out-string、明らかな利点があります。
rojo

18
1> $a = "This", "Is", "a", "cat"

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

2行目は操作を実行してホストに出力しますが、$ aは変更しません。

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

4> $a

This Is a cat

5> $a.Count

1

10

パイプから

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

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

書き込みホスト

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

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


これは驚くべきトリックです。例はもう機能しません。この答えは5年前ですが、私が今日学んだことを説明しようと思います。$ofsあるOutput Field Separator配列を出力するための文字列に変換する際に使用される変数。ここでは、コマンドによって実行される入力(パイプからの配列)の文字列値を返すスクリプトブロックで設定され&ます。$ofs以前は知らなかったし&、スクリプトブロックを引数として受け入れる
Martin Konopka

3

次のようにタイプを指定できます:

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

タイプの確認:

$a.GetType()

確認:

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

$ aの出力:

PS C:\> $ a 
この 
です 
a 
ネコ

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

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

Write-Host $sent
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.