目的別のおすすめ
| シンプル | 文字列を結合する(+演算子) |
| 通常で使用 | 文字列を結合する($()、変数配置のみ、${}) |
| ファイルパス | パス結合を行う(Join-Path) |
| ログ出力 | 日付・桁フォーマット(-f演算子) |
| 配列からCSV | 配列から文字列にする(-join) |
| 大量ループ結合 | 大量ループで文字列を結合するとき(StringBuilder) |
文字列を結合する(+演算子)
Write-Host ("ABC" + "DE") # ABCDE 文字列を結合
$a = "ABC"
$b = "DE"
$str =$a + $b # 変数の値を結合
$str # ABCDE
注意:数千回、数万回のループ内で結合を行う場合、通常の+結合は処理が非常に遅くなります。
→その場合は、StringBuilderを使用します。
Write-Hostを記述せず、変数だけでも出力されます。
文字列を結合する($()、変数配置のみ、${})
| "文字列$(変数)文字列" |
$id = "001"
$name = "suzuki"
$str = "idは$($id)の$($name)です"
$str # idは001のsuzukiです
変数を$()で括ります。
$()無しで変数を配置のみ
$()無しで、変数を配置するだけでも結合できます。
$id = "001"
$name = "suzuki"
$str1 = "idは $id の $name です"
$str1 # idは 001の suzuki です
$str2 = "idは$idの$nameです"
$str2 # idは
8行目は、文字列と変数の結合ができていません。
→変数の後に半角スペース等の区切りがないとうまくいきません。
$と{}(波括弧)
$と{}(波括弧)でも文字列の結合は可能です。
$id = "001"
$name = "suzuki"
$str1 = "idは${id}の${name}です"
$str1 # idは001のsuzukiです
パス結合を行う(Join-Path)
$base1 = "C:\logs\"
$base2 = "C:\logs"
$file = "app.log"
$path1 = Join-Path $base1 $file
$path1 # C:\logs\app.log
$path2 = Join-Path $base2 $file
$path2 # C:\logs\app.log
Join-Pathは、\が重なったり、足りなかったりした場合も自動で作成してくれます。
また、OSの違いを吸収してくれるため、クロスプラットフォームで動くスクリプトになります。
日付・桁フォーマット(-f演算子)
$user = "Admin"
$date = Get-Date -Format "yyyy/MM/dd"
$action = "ログイン"
$log = "[{0}] ユーザー {1} が {2} しました" -f $date, $user, $action
$log # [2026/02/23] ユーザー Admin が ログイン しました
文章の構造が崩れないため、ログ出力や定型文の作成に最適です。
同じ変数を何度も使い回す場合も便利です({0} {1} {0} など)。
配列から文字列にする(-join)
$items = @("Apple", "Banana", "Orange")
$csv = $items -join ", "
$csv #Apple, Banana, Orange
大量ループで文字列を結合するとき(StringBuilder)
$sb = New-Object System.Text.StringBuilder
foreach ($i in 1..100) {
[void]$sb.Append("Line $i")
}
$result = $sb.ToString()
$result #Line1からLine100まで表示される
大量データの処理ではStringBuilderを使います。
ループ処理の中で+演算子の結合を使用すると都度メモリ確保が発生して遅くなります。
Appendの代わりにAppendLineを使用すると改行されます。
関連の記事
