適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

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

PowerShellを使っていると文字列を結合したい場面があるのですが、物忘れが良く、いつも忘れてしまいます。

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

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

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

(2021/3/5追記) -f 演算子を追加しました。

6選になりました!

(2021/9/1追記)

単項演算子 -joinを追加しました。

7選になりました!

(2021/10/28追記) System.String#Joinメソッドを追加。

8選になりました!

+演算子で結合する

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

 
"Power" + "Shell"

出力結果

PowerShell

確かに直感的で簡単なのですが、結合する文字列が増えてきたり、結合する文字列が長かったりすると見づらかったりと扱いに困る場面があります。

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

 
1+1

出力結果

2

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

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

 
'1'+'1'
11

「"」ダブルクォーテーションでも同じ結果になりますが、ダブルクォーテーションだと変数を展開してしまう(後述)ので、間違いなく文字列として認識させるためにはシングルクォーテーションを使ってあげる必要があります。

変数を経由する

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

ちょっと何言っているかわかりませんね。

百聞は一見に如かず。

ご覧あれ。

 
$p='Power'
$s='Shell'
"$p$s"

出力結果

PowerShell

なんと$pと$sという変数をダブルクォーテーションで囲むと、あら不思議、変数の内容が展開され、中身が結合されて出力されました。

これは地味に重宝します。

ただし、「〇〇が大好き」の〇〇に変数を埋め込もうとするようなプレースホルダ―的な使い方をしたいときは要注意です。

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

 
$p='Power'
$s='Shell'
"$p$sが大好き"

出力結果

Power

本当であれば、「PowerShellが大好き」と出力されて欲しいところ、変数$pの中身しか展開されず、男らしく「Power」と出てきてしまいました。

おそらく後半の「$sが大好き」の部分は、「$s」という変数名ではなく、「$sが大好き」という変数名で解決されてしまい、何も出力されなかったのです。

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

 
$sが大好き="こそ力" 
"$p$sが大好き"                               

出力結果

Powerこそ力

めちゃくちゃ脳筋な結果が出力されました。

プレースホルダ的な使い方をしたい場合は、次のように書くことで実現することができます。

 
$p='Power'
$s='Shell'
"$($p)$($s)が大好き"

ダブルクォーテーションで囲まれた$()はカッコ内の変数をしっかり展開してくれます。

この例のように変数が複数連続する場合や、間違いなく変数を展開したいときに使えます。

また、「"$p$s"」を「'$p$s'」のようにシングルクォーテーションで囲んでしまうと変数の内容が展開されず、「$p$s」という「文字列」として扱われてしまうので注意が必要です。

 
$p='Power'
$s='Shell'    
'$p$s'     
#$p$sと出力される

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

配列を経由する

結合したい文字列が配列に格納されている文字列だったり、文字数が多い場合等は一度配列に格納してから結合すると取り回しが楽になります。

PowerShellでは配列内の文字列を結合するときに join演算子を使うことで、その要素を結合して出力することができます。

 
$ary=@('Power','Shell','が大好き')
$ary -join ''
#「PowerShellが大好き」と出力される

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

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

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

 
$ary=@('Power','Shell','が大好き')
$ary -join ','
#「Power,Shell,が大好き」と出力される

書式設定文字列を使う

書式設定文字列は、.NETを使う人にはおなじみ、string.Formatです。

PowerShellでは-f 演算子という演算子が用意され、簡単に書くことができます。

-fはFormatのfです。

-f演算子は、もちろん.NETのStringクラスのFormat()メソッドと同様の文字列書式を利用します。

使い方もString.Formatメソッドとほぼ同じです。

文字列を連結をする場合はこのように使います。

 
'{0}{1}' -f 'Power','Shell'
#「PowerShell」と出力される
'{0}{1}は{2}い' -f 'Power','Shell','おもしろ'
#「PowerShellはおもしろい」と出力される
'{0}{1}は{2}い' -f 'Power','Shell','から'
#「PowerShellはからい」と出力される

あらかじめ書式を用意し、そこに文字を埋め込むようなイメージです。

上記の例では、「'{0}{1}は{2}い'」が書式になります。

{}で囲まれた数値は演算対象の添え字的なもので、0から始まります。

-f演算子の後の三つの引数が、{0}~{2}にそのまま代入されます。

-f演算子を使いこなすと、文字列の連結だけでなく、込み入った表現をスマートに表すことが可能です。

ただし、規則が独特なところもあるのである程度慣れが必要かも知れません。

StringクラスのConcatメソッド

StringクラスのConcatメソッドを使う方法です。

しかしConcatメソッドのオーバーロードは次のように定義されており、どれを使えばいいか迷ってしまいます。

 
[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)

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

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

 
[string]::Concat("aa","bbb","cccc","ddd","eee","fff")
#「aabbbccccdddeeefff」と出力される

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

 
$ary=@('Power','Shell','が大好き')
[string]::Concat($ary)
#「PowerShellが大好き」と出力される

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

ただし、結合する文字の間に何かを挿入したいといった場合は、join演算子を使う方が効率的なので、場面によって使い分けます。

StringBuilderオブジェクトを使う

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

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

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

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

 
$sb=new-object System.Text.StringBuilder
[void]$sb.Append('Power')
[void]$sb.Append('Shell')
$sb.ToString()
#「PowerShell」と出力される

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

先の例では文字列の追加にAppendメソッドを使いましたが、書式に文字列を流し込みたいときはAppendFormatメソッドを使うと便利です。

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

 
[void]$sb.AppendFormat("{0}{1}", 'Power', 'Shell');
$sb.ToString()
#「PowerShell」と出力される

.NETの文字列書式の構文はインターネット上にたくさん情報がありますので、興味のある方は調べてみてください。

単項演算子-joinを使う

PowerShellの単項演算子の1つ、-joinを使うことでも簡単に結合することができます。

 
-join ("power","shell") 
#「powershell」と出力される

ちなみに対象をカッコで囲まないと、配列が作成されてしまいますのでお気をつけください。

 
-join "power","shell" 
#powerとshellの要素を持った配列(object[])が返る

System.StringクラスのJoinメソッド

.NETのSystem.StringクラスにはJoinメソッドがあります。

使い方は単項演算子の-joinと同じです。

 
#「PowerShell」と出力される
[System.String]::Join('','Power','Shell')

型を省略形で書くこともできます。

 
#「PowerShell」と出力される
[string]::Join('','Power','Shell')

終わりに

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

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

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

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

精進あるのみですね。

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

参考

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