コマンドプロンプトで文字列を置換する方法|PowerShell呼び出し・文字コード・バッチ例

Windowsのコマンドプロンプトでテキストを置換するなら、powershell.exeを呼び出して、入力とは別のファイルへ結果を書き出す方法が使えます。Get-Contentや-replaceはCMD自身の構文ではありません。findstrも検索用のコマンドで、検索した文字列を置換する機能はありません。

目次

まず使うコマンドと入力ファイルを確認

以下のコードはコマンドプロンプト(CMD)で実行する例です。作業するフォルダーへ移動し、input.txtを用意してください。ファイル例はUTF-8を前提とし、output.txt等は結果の確認用です。同名の出力ファイルが既にある場合は上書きされるため、必要なファイルと重ならない名前に変更します。

where powershell

powershell.exeの公式構文では、-Commandの後にPowerShellの処理を文字列として渡せます。CMDから渡す外側はダブルクォート、PowerShell内の文字列・パスはシングルクォートを使うと、この例のような短い処理を記述できます。

一番短い文字列置換:まず画面だけで試す

powershell -NoProfile -Command "'apple apple'.Replace('apple','orange')"

出力は「orange orange」です。String.Replaceは指定した文字列を文字列として扱い、該当するすべての箇所を置換した新しい文字列を返します。ここでは大文字と小文字を区別します。正規表現の記号を解釈させたくない置換に向きます。

UTF-8のテキストファイルを別ファイルへ置換出力

powershell -NoProfile -Command "[string]$text=Get-Content -LiteralPath '.\input.txt' -Raw -Encoding UTF8 -ErrorAction Stop; $text.Replace('apple','orange') | Set-Content -LiteralPath '.\output.txt' -Encoding UTF8 -NoNewline -ErrorAction Stop"

CMDではPowerShellを明示的に呼び出し、置換結果を別ファイルへ出してから確認します。 Get-Content -Rawで本文全体を一つの文字列として読み、Set-Content -NoNewlineで出力末尾に改行を追加しないようにします。元の本文中にある改行は置換対象に含めない限り文字列内に残ります。空のファイルも扱えるよう、読み取り結果を[string]へ変換しています。

powershell -NoProfile -Command "Get-Content -LiteralPath '.\output.txt' -Raw -Encoding UTF8"

まず画面で結果を確認します。読み取りながら同じinput.txtへパイプで書き込むと、読み取りが終わる前に書き込み先が切り詰められる問題があるため、入力と出力を同じパスにしないでください。

検索だけしたい場合はfindstr、置換とは区別

findstr /n /l /c:"apple" input.txt

findstrの公式資料にある/nは行番号、/lは文字列をそのまま検索する指定です。見つかった行の確認には使えますが、このコマンドではinput.txtの文字列は変わりません。日本語や文字コードが混在するファイルでは、PowerShell側で同じ文字コードを指定して確認してください。

powershell -NoProfile -Command "[string]$text=Get-Content -LiteralPath '.\input.txt' -Raw -Encoding UTF8; $text.Contains('apple')"

Trueは一致する文字列が含まれる、Falseは含まれないという確認結果です。大文字小文字や前後の空白が異なれば、想定していた文字列に一致しないことがあります。

文字列の置換と正規表現の置換は結果が違う

powershell -NoProfile -Command "'Apple apple'.Replace('apple','orange')"

文字列のReplaceでは「Apple orange」になります。

powershell -NoProfile -Command "'Apple apple' -replace 'apple','orange'"

PowerShellの-replaceは正規表現を使い、既定では大文字小文字を区別しないため、ここでは「orange orange」になります。区別する正規表現置換は-creplaceです。

powershell -NoProfile -Command "'Apple apple' -creplace 'apple','orange'"

この結果は「Apple orange」です。replace演算子の仕様を確認し、単なる文字列かパターンかを先に決めます。たとえばピリオドを文字として置換したいなら、次のようにReplaceを使えば正規表現の「任意の1文字」にはなりません。

powershell -NoProfile -Command "'v1.2 v1x2'.Replace('1.2','1.3')"

結果は「v1.3 v1x2」です。ユーザーが入力した任意の文字列をCMDのコマンドへそのまま連結する用途には、この固定例を流用しないでください。引用符やCMDの特殊文字を含む入力は、引数を持つスクリプト等で別途扱います。

正規表現の例:日付の区切りを変える

powershell -NoProfile -Command "'2026-10-03' -replace '(\d{4})-(\d{2})-(\d{2})','$1/$2/$3'"

「2026/10/03」が得られます。置換側の$1~$3は括弧で捕捉した部分です。PowerShell内でシングルクォートに囲み、変数として先に展開されないようにします。この例は文字列の形を変えるだけで、実在する日付かどうかは検証しません。

powershell -NoProfile -Command "[string]$text=Get-Content -LiteralPath '.\input.txt' -Raw -Encoding UTF8 -ErrorAction Stop; ($text -replace '(\d{4})-(\d{2})-(\d{2})','$1/$2/$3') | Set-Content -LiteralPath '.\date-output.txt' -Encoding UTF8 -NoNewline -ErrorAction Stop"

文字化けとBOM:PowerShellの版を確認

powershell -NoProfile -Command "$PSVersionTable.PSVersion"

Windows標準のpowershell.exeはWindows PowerShell、別途導入するpwsh.exeはPowerShell 7系です。文字コードの公式説明では、Windows PowerShellの-Encoding UTF8はBOM付き、PowerShell 7系ではUTF8はBOMなしです。この記事のpowershell.exe例はUTF-8として読み、UTF-8のBOM付きで出力します。元ファイルのBOMの有無をそのまま維持する保証はありません。

powershell -NoProfile -Command "Get-Content -LiteralPath '.\input.txt' -Raw -Encoding UTF8"

置換前からこの表示が文字化けするなら、UTF-8という前提を見直します。Shift_JIS、UTF-16等の入力をUTF-8として読み込んで保存すると、結果が壊れる可能性があります。改行、BOM、文字コードまで厳密に維持する必要がある場合は、確認済みの文字コードを明示した専用処理にしてください。

スペースを含むファイル名もLiteralPathで指定

powershell -NoProfile -Command "[string]$text=Get-Content -LiteralPath '.\input file.txt' -Raw -Encoding UTF8 -ErrorAction Stop; $text.Replace('apple','orange') | Set-Content -LiteralPath '.\output file.txt' -Encoding UTF8 -NoNewline -ErrorAction Stop"

この例ではinput file.txtを別途用意します。LiteralPathはパス中のワイルドカード記号を展開せず指定するための引数です。CMDの外側の引用符とPowerShell内の引用符を崩さないようにしてください。

置換結果の比較とファイル確認

fc /n input.txt output.txt

fcで行ごとの違いを確認できます。置換の想定外に大量の違いが出るなら、元のファイルを使い続け、出力の文字コード・改行・対象文字列を再確認します。本文が同じでもBOM等のバイト差があるため、用途に応じて内容と保存形式をそれぞれ確認してください。

powershell -NoProfile -Command "Get-Item -LiteralPath '.\input.txt','.\output.txt' | Select-Object Name,Length"

出力が存在するかとサイズを確認する補助になります。サイズが似ていることだけで正しい置換とは判断せず、内容も確認します。

繰り返す作業はCMDのバッチファイルにする

次をreplace-text.batとして保存し、input.txtのある作業フォルダーから実行します。PowerShellは明示的に呼び出し、読み書きのエラーを停止扱いにして終了コードを返します。入力ファイルは変更せず、output.txtだけを書き出します。

@echo off
powershell -NoProfile -Command "try { [string]$text=Get-Content -LiteralPath '.\input.txt' -Raw -Encoding UTF8 -ErrorAction Stop; $text.Replace('apple','orange') | Set-Content -LiteralPath '.\output.txt' -Encoding UTF8 -NoNewline -ErrorAction Stop; exit 0 } catch { Write-Error $_; exit 1 }"
if errorlevel 1 (
  echo Replacement failed.
  exit /b 1
)
echo Output written: output.txt
replace-text.bat

実行場所を変えると相対パスの参照先も変わります。定期実行や複数ファイルの処理へ広げる前に、作業フォルダー、入力・出力の絶対パス、対象一覧、重複出力、終了コードの記録を決めてください。大量の元ファイルを一括で上書きするループを最初から実行する必要はありません。

sedを使う場合:導入済み環境だけの選択肢

where sed

sedはWindowsのCMDに標準搭載されているコマンドではありません。whereで見つからない場合は、前述のPowerShellの方法を使えます。Git等と一緒に導入済みでも、どの実行ファイルを使っているかと実装・文字コードを確認してください。

sed "s/apple/orange/g" input.txt > sed-output.txt

CMDではこのようにダブルクォートを使う例です。ここでは入力とは別のsed-output.txtへ出力し、-iによる元ファイルの変更は行いません。GNU sedの説明ではgが各行の一致すべてを置換します。GNU sed以外の実装ではオプション等が異なることがあり、日本語・BOM・改行の扱いも事前確認が必要です。

うまく置換できないときの確認表

症状先に確認すること
Get-Contentが認識されないCMDへPowerShell構文だけを貼っていないか。powershell -Commandで呼び出す
sedが認識されない導入とPATH。標準搭載という前提にしない
置換箇所が多すぎる文字列Replaceと正規表現-replace、大文字小文字の指定
元ファイルが空になった同じ入力・出力パスで処理していないか。原本のコピーから再検証
文字化け・別アプリで読めない入力文字コード、出力のUTF-8 BOM、改行と利用先の要件
バッチだけ失敗する実行フォルダー、引用符、読み書き権限、終了コードとエラー内容

まず短い文字列で期待する置換を確認し、次にコピーした小さなファイルで結果を比較します。確認した出力を使うことで、検索、置換、文字コードの問題を分けて判断できます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次