PowerShellでログの行を分けたり、ファイル名を組み立てたり、数値を桁区切りで表示したりと、文字列の加工はあらゆる場面で登場します。基本のメソッドと演算子を押さえておくと、スクリプトがぐっと書きやすくなります。
ただし、いくつか注意点があります。最大の落とし穴は分割の-splitが正規表現として動くことです。"a.b.c" -split "."のように書くと、ピリオドが「任意の1文字」と解釈され、意図と違う結果になります。この記事では、分割・結合・切り出し・整形までを、実機で確認しながら整理します。
-splitは正規表現、.Split()はそのままの文字で分割します。.などの記号で割るときは要注意です。- 結合は
-join。@("a","b") -join "-"でa-bになります。 - 切り出しは
.Substring(開始, 長さ)。範囲外を指定するとエラーになります。 - 前後の空白除去は
.Trim()。特定の文字を削るなら.Trim("文字")です。 .Contains()は大文字小文字を区別します。区別しない判定は-likeや-matchです。- 数値や日付の整形は
-f演算子が便利です。"{0:N0}" -f 1234567で1,234,567になります。
正規表現の詳細は正規表現で検索・置換する方法、日付の書式はGet-Dateで日付をフォーマットする方法、配列の結合は配列とハッシュテーブルの使い方もあわせて参考になります。
文字列を分割する(-split と .Split の違い)
文字列を区切り文字で分けるには-split演算子か.Split()メソッドを使います。見た目は似ていますが、-splitは正規表現、.Split()はそのままの文字として扱う、という決定的な違いがあります。
# NG: -split は正規表現。"." は「任意の1文字」なので全部が区切りになる
"a.b.c" -split "."
# 空文字がいくつも返る(意図と違う)
# OK①: 記号を正規表現としてエスケープする
"a.b.c" -split "\."
# a, b, c
# OK②: .Split() はそのままの文字で分割する(正規表現ではない)
"a.b.c".Split(".")
# a, b, c
# -split の本領は正規表現での分割
"a1b2c3" -split "\d" # a, b, c(数字で区切る)
"a,b,c,d" -split ",", 2 # a, "b,c,d"(第2引数で分割数を制限)
実機で確認したところ、"a.b.c" -split "."はピリオドが任意の1文字とみなされ、空文字が並ぶ結果になりました。.や|、(などの記号で分割したいときは、.Split(".")を使うか、-split "\."のように正規表現としてエスケープしてください。一方、数字や空白などパターンで割りたいときは-splitが強力です。用途で使い分けます。
文字列を結合する(-join)
配列を1つの文字列に連結するには-joinを使います。区切り文字を指定できます。逆に、単純に文字列をつなぐだけなら+も使えます。
# 配列を区切り文字で結合
@("2026", "03", "09") -join "/" # 2026/03/09
@("a", "b", "c") -join ", " # a, b, c
# 区切りなしで結合
@("Power", "Shell") -join "" # PowerShell
# + でつなぐ(少数なら手軽)
$name = "山田"
"こんにちは、" + $name + "さん" # こんにちは、山田さん
# 変数を文字列に埋め込む(式は $() で囲む)
"$name さんは $($name.Length) 文字です" # 山田 さんは 2 文字です
大量の文字列をループでつなぐ場合は、+を繰り返すより配列に集めて最後に-joinするほうが高速です。二重引用符の中では$nameのように変数を直接埋め込めます。プロパティやメソッドの呼び出しを埋め込むときは$($name.Length)のように$()で囲みます。
部分文字列を取り出す(Substring・インデックス)
文字列の一部を取り出すには.Substring()を使います。開始位置(0始まり)と長さを指定します。長さを省略すると、そこから末尾までになります。
$s = "PowerShell" $s.Substring(0, 5) # Power(0文字目から5文字) $s.Substring(5) # Shell(5文字目から末尾まで) # インデックスで1文字を取り出す(負の数は末尾から) $s[0] # P(先頭) $s[-1] # l(末尾) # 範囲外を指定するとエラーになる # $s.Substring(50) # 例外(MethodInvocationException)
実機で確認したところ、文字列の長さを超える位置を.Substring()に渡すと、例外で停止しました。長さが不定の文字列を切り出すときは、$s.Lengthで長さを確認するか、後述のエラー処理と組み合わせてください。なお、$s[-1]のようにインデックスにマイナスを使うと末尾から数えられ、こちらは範囲外でも例外にならず安全です。
前後の空白や文字を削除する(Trim)
文字列の前後の空白を取り除くには.Trim()を使います。前だけ・後ろだけなら.TrimStart()・.TrimEnd()、特定の文字を削るなら引数に渡します。
" こんにちは ".Trim() # "こんにちは"(前後の空白を除去)
" 左だけ".TrimStart() # "左だけ"
"右だけ ".TrimEnd() # "右だけ"
# 特定の文字を削る(空白以外も指定できる)
"###重要###".Trim("#") # "重要"
"/path/".Trim("/") # "path"
# CSVやログの読み込みで、余分な空白を落とすのに役立つ
$value = " user01 ".Trim() # "user01"
実機でも、" こんにちは ".Trim()は前後の空白を落として"こんにちは"に、"###重要###".Trim("#")は"重要"になりました。ファイルやCSVから読み込んだ値は、余分な空白が付いていることが多いため、.Trim()で整えてから比較すると安全です。
大文字小文字の変換と「含む」判定
大文字・小文字の変換は.ToUpper()・.ToLower()です。文字列を含むかの判定には.Contains()がありますが、これは大文字小文字を区別する点に注意が必要です。
"PowerShell".ToUpper() # POWERSHELL
"PowerShell".ToLower() # powershell
# .Contains() は大文字小文字を区別する(.NET のメソッド)
"ABC".Contains("abc") # False ← 区別される!
"ABC".Contains("ABC") # True
# 区別せずに「含む」を判定したいなら -like や -match
"ABC" -like "*abc*" # True(-like は既定で区別しない)
"ABC" -match "abc" # True(-match も区別しない)
# 前方一致・後方一致
"report.txt".StartsWith("report") # True
"report.txt".EndsWith(".txt") # True
実機でも、"ABC".Contains("abc")はFalse(区別する)、"ABC" -like "*abc*"はTrue(区別しない)になりました。比較演算子の-like・-matchが既定で大文字小文字を区別しないのに対し、.Contains()などの.NETメソッドは区別します。区別したくないときは、両方を.ToLower()でそろえてから比べる方法もあります。
-f 演算子で書式を整える
数値の桁区切りやゼロ埋め、日付の整形には-f演算子が便利です。"書式" -f 値と書き、{0}・{1}が値の差し込み位置、:の後ろが書式指定です。
# 値の差し込み({0} が1つ目、{1} が2つ目)
"{0} は {1} 円" -f "りんご", 300 # りんご は 300 円
# 数値の桁区切り・ゼロ埋め
"{0:N0}" -f 1234567 # 1,234,567(3桁区切り)
"{0:D3}" -f 7 # 007(整数を3桁にゼロ埋め)
"{0:P1}" -f 0.123 # 12.3%(パーセント)
"{0:C}" -f 1235 # ¥1,235(通貨)
# 日付
"{0:yyyy/MM/dd}" -f (Get-Date)
# 幅をそろえて表(負の数で左寄せ)
"{0,-8}|{1,5}" -f "name", 42 # name | 42
よく使う書式指定子をまとめます。すべて実機で確認した出力です。
| 書式 | 意味 | 出力例 |
|---|---|---|
{0:N0} |
3桁区切り | 1,234,567 |
{0:N2} |
3桁区切り+小数2桁 | 1,234.50 |
{0:C} |
通貨 | ¥1,235 |
{0:D3} |
整数をゼロ埋め | 007 |
{0:0000} |
桁を指定してゼロ埋め | 0042 |
{0:F1} |
小数桁を固定 | 3.1 |
{0:P1} |
パーセント | 12.3% |
{0:X} |
16進数 | FF |
{0:yyyy/MM/dd} |
日付 | 2026/03/09 |
{0,-8} |
左寄せ・幅8 | name+空白 |
長さとパディング(Length・PadLeft)
文字数は.Lengthで取れます。決まった桁数にそろえたいときは.PadLeft()・.PadRight()を使い、不足分を埋める文字も指定できます。
"PowerShell".Length # 10(文字数) # 桁をそろえる(不足分を埋める文字を指定) "7".PadLeft(3, "0") # 007(左に 0 を詰めて3桁に) "42".PadRight(5, ".") # 42...(右に . を詰めて5桁に) # 連番ファイル名のゼロ埋めに便利 $num = 8 "file_" + $num.ToString().PadLeft(3, "0") + ".txt" # file_008.txt
ゼロ埋めは-fの{0:D3}でもできますが、すでに文字列になっている値には.PadLeft()が手軽です。連番ファイル名のように、桁をそろえたいときに役立ちます。
よくある失敗
-splitで記号がうまく区切れない
-splitは正規表現です。.や|などの記号で割るときは、.Split(".")を使うか-split "\."のようにエスケープします。
Substringで範囲外エラーが出る
文字列の長さを超える位置を指定すると例外になります。.Lengthで長さを確認するか、インデックス($s[-1]など)を使います。
.Containsで大文字小文字が一致しない
.Contains()は大文字小文字を区別します。区別したくないなら-like・-matchを使うか、両方を.ToLower()でそろえます。
ループ内の+で文字列を組み立てて遅くなる
大量の連結は+の繰り返しより、配列に集めて-joinするほうが高速です。
-fの差し込み番号を間違える
{0}は1つ目、{1}は2つ目の値です。番号と渡す値の順番がずれないように注意します。
よくある質問
.Split()(正規表現ではない)、数字や空白などのパターンで分割するなら-split(正規表現)が向いています。-splitで記号を使うときはエスケープが必要です。.Substring()は範囲外でエラーになるため、.Lengthで長さを確認してから使うか、$s[0..4] -join ""のようにインデックス範囲で取り出す方法もあります。末尾の1文字なら$s[-1]が安全です。"{0:N0}" -f 1234567で1,234,567になります。小数も付けるなら{0:N2}、通貨なら{0:C}です。数値の.ToString("N0")でも同じ結果になります。-like "*文字*"や-match "文字"を使います。これらは既定で大文字小文字を区別しません。.Contains()は区別するため、区別したくない場合には向きません。$num.ToString().PadLeft(3, "0")または"{0:D3}" -f $numで、008のようにゼロ埋めできます。連番ファイル名や整列表示に便利です。まとめ
-splitは正規表現、.Split()はそのままの文字で分割します。- 結合は
-join。大量連結は配列に集めてから-joinすると高速です。 - 切り出しは
.Substring()(範囲外はエラー)。末尾は$s[-1]が安全です。 - 前後の整形は
.Trim()、特定文字は.Trim("文字")です。 .Contains()は大文字小文字を区別します。区別しないなら-like・-matchです。- 数値・日付の整形は
-f演算子({0:N0}・{0:D3}など)が便利です。
PowerShellの文字列操作は、-splitが正規表現であることと、.Contains()が大文字小文字を区別すること、この2点さえ押さえれば大きくつまずきません。分割・結合・切り出し・整形を組み合わせて、ログ加工やファイル名生成をすっきり書けるようになります。
