Edited at

windowsの.batバッチファイルで文字列を置換する

More than 1 year has passed since last update.

windowsの.batバッチファイルで文字列を置換する


論よりコード


replace.bat

echo off

set tikan1=りんご
set tikan2=みかん
echo 置換開始
setlocal enabledelayedexpansion
for /f "delims=" %%A in (C:\copy_base\hoge.txt) do (
set line0=%%A
set line1=!line0:copy_base1=%tikan1%!
set line2=!line1:copy_base2=%tikan2%!
echo !line2!>>C:\after\hoge.txt
)
endlocal
echo 置換完了
pause


C:\copy_base\hoge.txt

Hello World

私はcopy_base1よりもcopy_base2が好きです


C:\after\hoge.txt

Hello World

私はりんごよりもみかんが好きです


解説

C:\copy_base\hoge.txtのファイルの中の

copy_base1をりんご

copy_base2をみかんに置換して

C:\after\hoge.txtとする

やってることはファイルを読み込んで1行ずつ置き換えて

echoで新規ファイルに書き込む。

echo off は必須


注意点

これだけのコードだと

echoの都合で

・空行はなかったことにされる

・半角スペースしか無い行は echo off が出力される

それらをどうにかするにはifなどで制御が必要かと思われる

今回は割愛

また、enabledelayedexpansionより

!マークが遅延演算子になるため無視され

!マークで囲まれていると消えてなくなる

つまり以下のようなjavaScriptコードだと


C:\copy_base\hoge.js

var a = 100

var b = 200
var c = 100
if (a !== b && a !== c){
alert("true")
} else {
alert("false")
}


C:\after\hoge.js

var a = 100

var b = 200
var c = 100
if (a == c){
alert("true")
} else {
alert("false")
}

となってしまう。!== b && a !が演算子となって消えてしまう。

たちの悪いことに上記例だとシンタックスエラーにはならないから気が付きづらい

こういう場合もとのファイルにかかれている!マークを^でエスケープしておくのが一番楽そうである


C:\copy_base\hoge.js

var a = 100

var b = 200
var c = 100
if (a ^!== b && a ^!== c){
alert("true")
} else {
alert("false")
}


文字化けしてしまう時

コンソールの設定がデフォルトの932(Shift-JIS)で

コピー元のファイルが65001(UTF-8)である時にありがち

chcp 65001

で文字コードを変えてしまえば良い


replace.bat

echo off

set tikan1=りんご
set tikan2=みかん
echo 置換開始
chcp 65001
setlocal enabledelayedexpansion
for /f "delims=" %%A in (C:\copy_base\hoge.txt) do (
set line0=%%A
set line1=!line0:copy_base1=%tikan1%!
set line2=!line1:copy_base2=%tikan2%!
echo !line2!>>C:\after\hoge.txt
)
endlocal
chcp 932
echo 置換完了
pause