【PowerShell】文字列操作まとめ|-split・部分文字列・Trim・-f 書式・結合

【PowerShell】文字列操作まとめ|-split・部分文字列・Trim・-f 書式・結合 PowerShell

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 12345671,234,567になります。

正規表現の詳細は正規表現で検索・置換する方法、日付の書式はGet-Dateで日付をフォーマットする方法、配列の結合は配列とハッシュテーブルの使い方もあわせて参考になります。

スポンサーリンク

文字列を分割する(-split と .Split の違い)

文字列を区切り文字で分けるには-split演算子か.Split()メソッドを使います。見た目は似ていますが、-splitは正規表現.Split()はそのままの文字として扱う、という決定的な違いがあります。

split.ps1
# 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引数で分割数を制限)
記号で割るなら .Split() か エスケープを

実機で確認したところ、"a.b.c" -split "."はピリオドが任意の1文字とみなされ、空文字が並ぶ結果になりました。.|(などの記号で分割したいときは、.Split(".")を使うか、-split "\."のように正規表現としてエスケープしてください。一方、数字や空白などパターンで割りたいときは-splitが強力です。用途で使い分けます。

文字列を結合する(-join)

配列を1つの文字列に連結するには-joinを使います。区切り文字を指定できます。逆に、単純に文字列をつなぐだけなら+も使えます。

join.ps1
# 配列を区切り文字で結合
@("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始まり)と長さを指定します。長さを省略すると、そこから末尾までになります。

substring.ps1
$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は範囲外でエラーになる

実機で確認したところ、文字列の長さを超える位置を.Substring()に渡すと、例外で停止しました。長さが不定の文字列を切り出すときは、$s.Lengthで長さを確認するか、後述のエラー処理と組み合わせてください。なお、$s[-1]のようにインデックスにマイナスを使うと末尾から数えられ、こちらは範囲外でも例外にならず安全です。

前後の空白や文字を削除する(Trim)

文字列の前後の空白を取り除くには.Trim()を使います。前だけ・後ろだけなら.TrimStart().TrimEnd()、特定の文字を削るなら引数に渡します。

trim.ps1
"  こんにちは  ".Trim()        # "こんにちは"(前後の空白を除去)
"  左だけ".TrimStart()          # "左だけ"
"右だけ  ".TrimEnd()            # "右だけ"

# 特定の文字を削る(空白以外も指定できる)
"###重要###".Trim("#")          # "重要"
"/path/".Trim("/")              # "path"

# CSVやログの読み込みで、余分な空白を落とすのに役立つ
$value = "  user01  ".Trim()    # "user01" 

実機でも、" こんにちは ".Trim()は前後の空白を落として"こんにちは"に、"###重要###".Trim("#")"重要"になりました。ファイルやCSVから読み込んだ値は、余分な空白が付いていることが多いため、.Trim()で整えてから比較すると安全です。

大文字小文字の変換と「含む」判定

大文字・小文字の変換は.ToUpper().ToLower()です。文字列を含むかの判定には.Contains()がありますが、これは大文字小文字を区別する点に注意が必要です。

case-contains.ps1
"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}が値の差し込み位置、:の後ろが書式指定です。

format-operator.ps1
# 値の差し込み({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()を使い、不足分を埋める文字も指定できます。

length-pad.ps1
"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つ目の値です。番号と渡す値の順番がずれないように注意します。

よくある質問

Q-split と .Split() はどちらを使うべきですか?
A記号や固定文字で単純に分割するなら.Split()(正規表現ではない)、数字や空白などのパターンで分割するなら-split(正規表現)が向いています。-splitで記号を使うときはエスケープが必要です。
Q文字列の一部を安全に切り出すには?
A.Substring()は範囲外でエラーになるため、.Lengthで長さを確認してから使うか、$s[0..4] -join ""のようにインデックス範囲で取り出す方法もあります。末尾の1文字なら$s[-1]が安全です。
Q数値を3桁区切りで表示するには?
A"{0:N0}" -f 12345671,234,567になります。小数も付けるなら{0:N2}、通貨なら{0:C}です。数値の.ToString("N0")でも同じ結果になります。
Q大文字小文字を区別せずに「含む」を判定するには?
A-like "*文字*"-match "文字"を使います。これらは既定で大文字小文字を区別しません。.Contains()は区別するため、区別したくない場合には向きません。
Qゼロ埋めの連番を作るには?
A$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点さえ押さえれば大きくつまずきません。分割・結合・切り出し・整形を組み合わせて、ログ加工やファイル名生成をすっきり書けるようになります。