タイトルまんま、Windowsのバッチ(bat)で文字エンコーディング(コードページ)を変更して処理をし、その後もとに戻しておきたい。
(具体的にはSQL/Plusをたたきたかった)
処理そのものはUTF-8で動かしたいけど、WindowsはShift-JISっぽい「MS932」で。。。
単純にメインの処理だけ記述していると文字エンコーディングの違いで文字化けしまくりになります。
そこで、コードページを変更して動かせばいいわけですが、普段はMS932のままで動いてほしいのでUTF-8に変わりっぱなしでは困る。
次に考えるのはコードページを変更して処理をした後にMS932に戻せばいい!
と、ここで問題。
もし元がMS932じゃなかったら。。。固定で「MS932に戻す」みたいなことをしてしまうと、それが欠陥になっちゃう。
そんなわけで、処理開始前にコードページが何になっているかバックアップしておき、希望のコードページで処理した後に「元に戻す」ようにしました。
久々にバッチを書いたw
PowerShellの方が楽だよね~
@ECHO OFF
REM === 実行モード
REM --- コードページ変更を行う(YES:1, NO:0)
SET CHCP=0
REM --- 変更後のコードページ
SET CP=932
REM === システム変数(触らないで)
SET T_CP=
REM ------------------
REM | メインループ |
REM ------------------
REM === コードページ変更
IF %CHCP%==1 (CALL :CHCP_ %CP%)
REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
REM @@@ ここに処理を記述 @@@
REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
REM === コードページ復元
IF %CHCP%==1 (CALL :CHCP_DEFAULT)
REM === おわり
GOTO :END_
REM ------------------
REM | サブルーチン |
REM ------------------
REM === コードページをSHIFT-JIS(MS932)に変更
:CHCP_
FOR /F "usebackq tokens=2 DELIMS=:" %%C IN (`CHCP`) DO SET T_CP=%%C
CHCP %1
GOTO :LOCAL_END_
REM === コードページを戻す
:CHCP_DEFAULT
CHCP %T_CP%
GOTO :LOCAL_END_
REM ------------------
REM | おわり |
REM ------------------
:END_
ENDLOCAL
:LOCAL_END_
EXIT /b 0