windowsの.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
Hello World
私はcopy_base1よりもcopy_base2が好きです
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コードだと
var a = 100
var b = 200
var c = 100
if (a !== b && a !== c){
alert("true")
} else {
alert("false")
}
var a = 100
var b = 200
var c = 100
if (a == c){
alert("true")
} else {
alert("false")
}
となってしまう。!== b && a !が演算子となって消えてしまう。
たちの悪いことに上記例だとシンタックスエラーにはならないから気が付きづらい
こういう場合もとのファイルにかかれている!マークを^でエスケープしておくのが一番楽そうである
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
で文字コードを変えてしまえば良い
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