Windowsバッチ(.bat)でテキストファイル内の特定文字列を置換したい

この記事は最新更新日から、2年以上経過しています。

概要

Windowsの.batファイルとかで、テキストファイル内の特定の文字列を置換したい瞬間はありませんか? 私はありました。
PowerShellでやろうとしたらエンコード問題とかが出てきていやになってきたのでbatで作ります。

参考サイト

Windowsバッチでファイル内の特定文字を置換する方法 - Qiita
はじめに今回ファイル内の特定文字を置換したい時に使えるWindowsバッチをご紹介します。1. サンプルコマンドまずサンプルとして、「こんにちは」と記載されたinput.txtを「HELLO」…

コード

下記の状態のファイルで確認を行っています。余談ですがこの状態(shift-jisじゃない状態)だとコンソールの説明が英語になります。

batファイル:UTF-8(BOM付き)、CRLF
インプットファイル:UTF-8(BOM付き)、CRLF

あとUTF-8の場合はREMにつけるコメントも「”」で囲っておいたほうがよいです。エラーになる場合があります…。

@echo off
REM "UTF-8の場合はエンコードを指定する"
chcp 65001

REM "置換したいファイルのあるファイルパス"
SET TARGET_DIR="C:\Users\your_name\Desktop\新しいフォルダー"

REM "検索対象文字列と置換後文字列"
SET BEFORE_STRING="target: 'node',"
SET AFTER_STRING="target: 'aaaaaaaaaaaaaaa',"

REM "入出力ファイル名"
SET INPUT_FILE="input.txt"
SET OUTPUT_FILE="output.txt"

REM "置換サブルーチンの呼び出し"
call:rep1 %TARGET_DIR% %BEFORE_STRING% %AFTER_STRING% %INPUT_FILE% %OUTPUT_FILE%

REM "処理の終了"
PAUSE
exit /b



:rep1
REM "置換サブルーチン本体"

REM "変数宣言(引数がダブルクオートが入っているため、チルダを使う)"
SET TARGET_DIR=%~1
SET BEFORE_STRING=%~2
SET AFTER_STRING=%~3
SET INPUT_FILE=%~4
SET OUTPUT_FILE=%~5

REM "引数の確認"
ECHO %TARGET_DIR%
ECHO %BEFORE_STRING%
ECHO %AFTER_STRING%
ECHO %INPUT_FILE%
ECHO %OUTPUT_FILE%

REM "ファイルパス記載するとリネームがうまくいかないため、作業ディレクトリを移動している"
CD %TARGET_DIR%

REM "改行で区切って行単位で置換後、OUTPUT_FILEに書き出し"
setlocal enabledelayedexpansion
for /f "delims=" %%a in (%INPUT_FILE%) do (
  set line=%%a
  echo !line:%BEFORE_STRING%=%AFTER_STRING%!>>%OUTPUT_FILE%
)
endlocal

REM "元ファイルの削除"
DEL %INPUT_FILE%
REM "置換後ファイルをリネーム"
REN %OUTPUT_FILE% %INPUT_FILE%
exit /b

おわり。