適材適所

PowerShellやVBAなどのプログラミングに関すること、キャリア、子育ての3本で書いていきます

PowerShellで文字列を結合する方法 5選

PowerShellを使っていると文字列を結合したい場面があるのですが、

頻度が少ないこともあってか、いつも忘れてしまいます。

そして結局+で結合してしまうという愚行を犯している日々です。

PowerShellでは.NETの力もあって文字列を結合する方法がたくさんあります。

今回は備忘録を兼ねてPowerShellで文字列を結合する方法を書き残しておきたいと思います。

+演算子で結合する

一番直感的な書き方です。

PS C:\> "Power" + "Shell"
PowerShell

確かに直感的で簡単なのですが、結合する文字列が増えてきたり、

結合する文字列が長かったりすると見づらかったりと扱いに困る場面があります。

また、数字を結合させようとすると当たり前ですが足し算されてしまいます。

PS C:\> 1+1
2

本当は11にしてほしいのに・・・

そういうときは「'」シングルクォーテーションで囲んで「1」を文字列として扱います。

PS C:\> '1'+'1'
11

「"」ダブルクォーテーションでも同じ結果になりますが

ダブルクォーテーションだと変数を展開してしまう(後述)ので

間違いなく文字列として認識させるためにはシングルクォーテーションを使ってあげる方がよいです。

変数を経由する

PowerShellは文字列の中に直接、変数を書くことができます。

PS C:\> $p='Power'
PS C:\> $s='Shell'
PS C:\> "$p$s"
PowerShell

ダブルクォーテーションで変数を囲むことで変数の内容が展開され、変数の中身が結合されました。

プレースホルダ―的に変数を埋め込みたいときは要注意です。

変数の後に固定の文字列があると、変数の終わりが認識されず、正しく出力されません。

PS C:\> "$p$sが大好き"
Power

変数$pの中身しか展開されませんでした。

「$sが大好き」の部分は、$sという変数名ではなく、

「$sが大好き」という変数名で解決されてしまい、何も出力されなかったのです。

試しに「$sが大好き」という変数を用意して先ほどのコマンドを実行してみると変数が展開されていることがわかります。

PS C:\> $sが大好き="うええええ" 
PS C:\> "$p$sが大好き"                               
Powerうええええ

また、"$p$s"を'$p$s'のようにシングルクォーテーションで

囲んでしまうと変数の内容が展開されず、

$p$sという「文字列」になってしまうので注意が必要です。

PS C:\> $p='Power'
PS C:\> $s='Shell'    
PS C:\> '$p$s'     
$p$s

変数を展開する場合は必ずダブルクォーテーションで囲みましょう。

配列を経由する

結合したい文字列が配列の文字列だったり、

文字数が多い場合は一旦、配列に格納してから結合すると取り回しが楽になります。

配列内の文字列を結合するときに使えるのが join演算子です。

次のように使います。

PS C:\> $ary=@("Power","Shell")
PS C:\> $ary -join ''
PowerShell

join演算子の後は、区切り文字を指定します。

先ほどの例のように単純に連結する場合は空白('')を指定します。

他にもカンマ区切りにしたい場合は次のように指定します。

PS C:\> $ary=@("Power","Shell","が大好きです。")
PS C:\> $ary -join ','
Power,Shell,が大好きです。

書式設定文字列を使う

書式設定文字列は、.NETで用意されている機能です。

PowerShellでも問題なく使うことがききます。

stringクラスのConcatメソッドを使います。

といってもConcatメソッドのオーバーロードは次のように定義されており、

どれを使えばいいか迷ってしまいます。

PS C:\> [string]::Concat

OverloadDefinitions
-------------------
static string Concat(System.Object arg0)
static string Concat(System.Object arg0, System.Object arg1)
static string Concat(System.Object arg0, System.Object arg1, System.Object arg2)
static string Concat(System.Object arg0, System.Object arg1, System.Object arg2, System.Object arg3)
static string Concat(Params System.Object[] args)
static string Concat(System.Collections.Generic.IEnumerable[string] values)
static string Concat(string str0, string str1)
static string Concat(string str0, string str1, string str2)
static string Concat(string str0, string str1, string str2, string str3)
static string Concat(Params string[] values)
static string Concat[T](System.Collections.Generic.IEnumerable[T] values)

オーバーロードは沢山ありますが、実は引数に指定した文字はいくつでも結合することができます。

そのため深く考える必要はありません。

PS C:\> [string]::Concat("aa","bbb","cccc","ddd","eee","fff")
aabbbccccdddeeefff

また、配列を引数に指定することで、配列の要素を結合することが可能です。

PS C:\> [string]::Concat($ary)
PowerShellが大好きです。

この場合はjoin演算子でも代用できるので、どちらでも使うことができます。

ただし、結合する文字の間に何かを挿入したいといった場合は、

join演算子を使う方が効率的なので、場面によって使い分けます。

StringBuilderオブジェクトを使う

System.Textにある、StringBuilderクラスを使うことで柔軟に文字列の構築が行えます。

StringBuilderとは、「可変型の文字列」を表すクラスです。

この型の変数に文字列を追加したり、削除したりすることで、文字列を構築します。

様々な機能があるのでここでは詳細は割愛しますが、触りだけ紹介します。

PS C:\> $sb=new-object System.Text.StringBuilder
PS C:\> [void]$sb.Append('Power')
PS C:\> [void]$sb.Append('Shell')
PS C:\> $sb.ToString()
PowerShell

ToStringメソッドを呼ぶことで最終的な文字列を出力することができます。

先の例では文字列の追加にAppendメソッドを使いましたが、

書式に文字列を流し込みたいときはAppendFormatメソッドを使うと便利です。

流し込みには文字列書式を使うことができるので、文字列の構築が柔軟にできます。

PS C:\> [void]$sb.AppendFormat("{0}{1}", 'Power', 'Shell');
PS C:\> $sb.ToString()
PowerShell

.NETの文字列書式の構文はインターネット上にたくさん情報がありますので、

興味のある方は調べてみてください。

終わりに

PowerShellで文字列を結合する方法を紹介してみました。

PowerShellでは文字列の結合の方法がたくさんあるので、用途に応じて色々使い分けてみてください。

といっても私はここに書いたことの半分も使いこなせていませんが・・・

それは多分、使い捨てのスクリプトばっかり書いているからかも( ^ω^)・・・

精進あるのみですな。

ということで、ここまでお読みいただきありがとうございました。

参考

文字列での変数の代入について知りたかったことのすべて - PowerShell | Microsoft Docs