◇Windowsのバッチファイルでエスケープシーケンスによる画面制御

# ◇エスケープシーケンスによる画面制御
カラーコードなど制御文についてはマイクロソフトの「[コンソール仮想端末シーケンス][]」をご覧ください。

### ・画面制御とカラー文字のサンプル
<details><summary>画面制御とカラー文字のサンプル</summary>

```bat:Esc.bat
@echo off


:: 遅延展開 バグの原因になる場合があるので注意;
setlocal enabledelayedexpansion


:: %ESC%でエスケープシーケンスを利用できるようにする;
for /f "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (set ESC=%%b)


echo.
echo 画面制御
echo 文字列  説明  備考
echo %%ESC%%[0J  カーソル位置から画面右下まで消去
echo %%ESC%%[1J  画面左上からカーソル位置まで消去
echo %%ESC%%[2J  画面クリア
echo %%ESC%%[0K  カーソル位置から右側消去  同一行
echo %%ESC%%[1K  カーソル位置から左側消去  同一行
echo %%ESC%%[2K  カーソルのある１行の消去
echo %%ESC%%[nA  カーソルをn行上へ移動
echo %%ESC%%[nB  カーソルをn行下へ移動
echo %%ESC%%[nC  カーソルをn桁右へ移動  右端で停止
echo %%ESC%%[nD  カーソルをn桁左へ移動  左端で停止
echo %%ESC%%[r;cH  カーソルをr行、n桁目へ移動  もしくは%%ESC%%[r;nf
echo ------------------------------------
echo.
echo.


echo.
echo これはテストです。この行が書き変わります。
pause

echo %ESC%[2A%ESC%[2K
echo %ESC%[1A%ESC%[2K
echo %ESC%[2A
echo 書き換えられたでしょうか
pause


echo.
echo %ESC%[41;97mエスケープシーケンスによるカラー出力テスト%ESC%[0m
echo.
echo https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences
echo.
echo %%ESC%%[101;93m%ESC%[101;93m STYLES %ESC%[0m
echo %%ESC%%[0m %ESC%[0mReset%ESC%[0m
echo %%ESC%%[1m %ESC%[1mBold%ESC%[0m
echo %%ESC%%[4m %ESC%[4mUnderline%ESC%[0m
echo %%ESC%%[7m %ESC%[7mInverse%ESC%[0m
echo.
echo %%ESC%%[42;93m%ESC%[42;93m NORMAL FOREGROUND COLORS %ESC%[0m
echo %%ESC%%[30m %ESC%[30mBlack%ESC%[0m (black)
echo %%ESC%%[31m %ESC%[31mRed%ESC%[0m
echo %%ESC%%[32m %ESC%[32mGreen%ESC%[0m
echo %%ESC%%[33m %ESC%[33mYellow%ESC%[0m
echo %%ESC%%[34m %ESC%[34mBlue%ESC%[0m
echo %%ESC%%[35m %ESC%[35mMagenta%ESC%[0m
echo %%ESC%%[36m %ESC%[36mCyan%ESC%[0m
echo %%ESC%%[37m %ESC%[37mWhite%ESC%[0m
echo.
echo %%ESC%%[43;30m%ESC%[43;30m NORMAL BACKGROUND COLORS %ESC%[0m
echo %%ESC%%[40m %ESC%[40mBlack%ESC%[0m
echo %%ESC%%[41m %ESC%[41mRed%ESC%[0m
echo %%ESC%%[42m %ESC%[42mGreen%ESC%[0m
echo %%ESC%%[43m %ESC%[43mYellow%ESC%[0m
echo %%ESC%%[44m %ESC%[44mBlue%ESC%[0m
echo %%ESC%%[45m %ESC%[45mMagenta%ESC%[0m
echo %%ESC%%[46m %ESC%[46mCyan%ESC%[0m
echo %%ESC%%[47m %ESC%[47mWhite%ESC%[0m (white)
echo.
echo %%ESC%%[47;30m%ESC%[47;30m STRONG FOREGROUND COLORS %ESC%[0m
echo %%ESC%%[90m %ESC%[90mWhite%ESC%[0m
echo %%ESC%%[91m %ESC%[91mRed%ESC%[0m
echo %%ESC%%[92m %ESC%[92mGreen%ESC%[0m
echo %%ESC%%[93m %ESC%[93mYellow%ESC%[0m
echo %%ESC%%[94m %ESC%[94mBlue%ESC%[0m
echo %%ESC%%[95m %ESC%[95mMagenta%ESC%[0m
echo %%ESC%%[96m %ESC%[96mCyan%ESC%[0m
echo %%ESC%%[97m %ESC%[97mWhite%ESC%[0m
echo.
echo %%ESC%%[41;97m%ESC%[41;97m STRONG BACKGROUND COLORS %ESC%[0m
echo %%ESC%%[100m %ESC%[100mBlack%ESC%[0m
echo %%ESC%%[101m %ESC%[101mRed%ESC%[0m
echo %%ESC%%[102m %ESC%[102mGreen%ESC%[0m
echo %%ESC%%[103m %ESC%[103mYellow%ESC%[0m
echo %%ESC%%[104m %ESC%[104mBlue%ESC%[0m
echo %%ESC%%[105m %ESC%[105mMagenta%ESC%[0m
echo %%ESC%%[106m %ESC%[106mCyan%ESC%[0m
echo %%ESC%%[107m %ESC%[107mWhite%ESC%[0m
echo.
echo %%ESC%%[101;93m%ESC%[101;93m COMBINATIONS %ESC%[0m
echo %%ESC%%[31m                     %ESC%[31mred foreground color%ESC%[0m
echo %%ESC%%[7m                      %ESC%[7minverse foreground ^<-^> background%ESC%[0m
echo %%ESC%%[7;31m                   %ESC%[7;31minverse red foreground color%ESC%[0m
echo %%ESC%%[7m and nested %%ESC%%[31m %ESC%[7mbefore %ESC%[31mnested%ESC%[0m
echo %%ESC%%[31m and nested %%ESC%%[7m %ESC%[31mbefore %ESC%[7mnested%ESC%[0m
echo.


:: 終了処理（エクスプローラーから起動されていた場合はPauseする）;
:EndProcess
echo %cmdcmdline% | find /i "%~f0">NUL
if %ERRORLEVEL% equ 0 (cmd /k)
goto :eof
```
</details>


### ・可視光線のシミュレート
これは見たことないですね。
最後は白になるようにしていますがこんな感じのを表示します。
![Visible light](https://upload.wikimedia.org/wikipedia/commons/c/cc/Spectrum.svg)

<details><summary>R.B.G. カラーグラデーションのサンプル</summary>

```bat:RGB.bat
@echo off


:: 遅延展開 バグの原因になる場合があるので注意;
setlocal enabledelayedexpansion


:: %ESC%でエスケープシーケンスを利用できるようにする;
for /f "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (set ESC=%%b)

set MinValue=0
set MaxValue=255
set ChgValue=0
set Shape=■

echo.
echo R.G.B. Pattern

set R=%MinValue%
set G=%MinValue%
set B=%MinValue%
set RGBBox=

set RGBBox=%ESC%[38;2;%R%;%G%;%B%m%Shape%
set R=%MaxValue%
set RGBBox=%RGBBOX%%ESC%[38;2;%R%;%G%;%B%m%Shape%
set G=%MaxValue%
set RGBBox=%RGBBOX%%ESC%[38;2;%R%;%G%;%B%m%Shape%
set R=%MinValue%
set RGBBox=%RGBBOX%%ESC%[38;2;%R%;%G%;%B%m%Shape%
set B=%MaxValue%
set RGBBox=%RGBBOX%%ESC%[38;2;%R%;%G%;%B%m%Shape%
set G=%MinValue%
set RGBBox=%RGBBOX%%ESC%[38;2;%R%;%G%;%B%m%Shape%
set R=%MaxValue%
set RGBBox=%RGBBOX%%ESC%[38;2;%R%;%G%;%B%m%Shape%
set G=%MaxValue%
set RGBBox=%RGBBOX%%ESC%[38;2;%R%;%G%;%B%m%Shape%
echo %RGBBOX%%ESC%[0m
echo.


echo Mono Color Pattern / R.G.B. Gradations
set ChgValue=8
set RGBBox=
for /l %%m in (%MinValue%, %ChgValue%, %MaxValue%) do (
  set RGBBox=!RGBBox!%ESC%[38;2;%%m;%%m;%%mm%Shape%
)
echo %RGBBOX%%ESC%[0m
echo.


echo Spectrum Pattern / R.G.B. Gradations
set R=%MinValue%
set G=%MinValue%
set B=%MinValue%
set ChgValue=32
set RGBBox=

:: Blue Min to Max;
for /l %%b in (%MinValue%, %ChgValue%, %MaxValue%) do (
  set RGBBox=!RGBBox!%ESC%[38;2;%R%;%G%;%%bm%Shape%
)
set B=%MaxValue%

:: Green Min to Max;
for /l %%g in (%MinValue%, %ChgValue%, %MaxValue%) do (
  set RGBBox=!RGBBox!%ESC%[38;2;%R%;%%g;%B%m%Shape%
)
set G=%MaxValue%

:: Blue Max to Min;
for /l %%b in (%MaxValue%, -%ChgValue%, %MinValue%) do (
  set RGBBox=!RGBBox!%ESC%[38;2;%R%;%G%;%%bm%Shape%
)
set B=%MinValue%

:: Red Min to Max;
for /l %%r in (%MinValue%, %ChgValue%, %MaxValue%) do (
  set RGBBox=!RGBBox!%ESC%[38;2;%%r;%G%;%B%m%Shape%
)
set R=%MaxValue%

:: Green Max to Min;
for /l %%g in (%MaxValue%, -%ChgValue%, %MinValue%) do (
  set RGBBox=!RGBBox!%ESC%[38;2;%R%;%%g;%B%m%Shape%
)
set G=%MinValue%

:: Blue Min to Max;
for /l %%b in (%MinValue%, %ChgValue%, %MaxValue%) do (
  set RGBBox=!RGBBox!%ESC%[38;2;%R%;%G%;%%bm%Shape%
)
set B=%MaxValue%

:: Green Min to Max;
for /l %%g in (%MinValue%, %ChgValue%, %MaxValue%) do (
  set RGBBox=!RGBBox!%ESC%[38;2;%R%;%%g;%B%m%Shape%
)
set G=%MaxValue%

set RGBBox=%RGBBox%%ESC%[38;2;%R%;%G%;%B%m%Shape%

echo %RGBBOX%%ESC%[0m
echo.


:: 終了処理（エクスプローラーから起動されていた場合はPauseする）;
:EndProcess
echo %cmdcmdline%|find /i "%~f0">NUL
if %ERRORLEVEL% equ 0 (cmd /k)
goto :eof
```
</details>

[コンソール仮想端末シーケンス]: https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences


# おわりに

他にも「[⧉Windowsのバッチファイルのテクニックをご紹介します][]」にてご紹介させて頂いております。
お時間ありましたら覗いてみてください
お粗末様でした。

https://github.com/Aromatibus/


[⧉Windowsのバッチファイルのテクニックをご紹介します]: https://qiita.com/aromatibus/items/12fa4775f38c9889a686