1. ホーム
  2. windows

Windowsのバッチファイルに複数の色を持たせるには?

2023-08-21 13:36:25

質問

Windows のバッチ ファイルで、同じ行に異なる色のテキストを表示することが可能かどうか、疑問に思っています。

echo hi world

私は"hi"を1色に、"world"を別の色にしたいのです。COLORコマンドを変数として設定すればいいのかもしれませんね。

set color1= color 2
set color9= color A

と共に、同じ行に配置します。

echo hi world

が、どうすればいいのかわからない。

どのように解決するのですか?

実はこれ、一時ファイルを作成しなくてもできるんです。 jeb と dbenham が説明した方法は、バックスペースを含まないターゲット ファイルでも動作します。重要な点は、findstr.exe によって認識される行が CRLF で終わってはいけないということです。 したがって、CRLFで終わらない行でスキャンする明らかなテキストファイルは、そのような行で終わらせることができれば、起動するバッチ自身である! この方法で動作する最新のサンプルスクリプトはこちら...

前の例からの変更点。

  • 検索可能な文字列として、最終行のダッシュ 1 つを使用します。(短く、バッチ内の他のどこにもこのように表示されていない必要があります)。
  • ルーチンと変数の名前を変更し、もう少しオブジェクト指向になるようにしました :-)
  • パフォーマンスを少し改善するために、1 つのコール レベルを削除しました。
  • コメントを追加しました (他の多くのスクリプト言語と同じように見えるように :# で始まります)。

@echo off
setlocal

call :Echo.Color.Init

goto main

:Echo.Color %1=Color %2=Str [%3=/n]
setlocal enableDelayedExpansion
set "str=%~2"
:Echo.Color.2
:# Replace path separators in the string, so that the final path still refers to the current path.
set "str=a%ECHO.DEL%!str:\=a%ECHO.DEL%\..\%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%!"
set "str=!str:/=a%ECHO.DEL%/..\%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%!"
set "str=!str:"=\"!"
:# Go to the script directory and search for the trailing -
pushd "%ECHO.DIR%"
findstr /p /r /a:%~1 "^^-" "!str!\..\!ECHO.FILE!" nul
popd
:# Remove the name of this script from the output. (Dependant on its length.)
for /l %%n in (1,1,12) do if not "!ECHO.FILE:~%%n!"=="" <nul set /p "=%ECHO.DEL%"
:# Remove the other unwanted characters "\..\: -"
<nul set /p "=%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%"
:# Append the optional CRLF
if not "%~3"=="" echo.
endlocal & goto :eof

:Echo.Color.Var %1=Color %2=StrVar [%3=/n]
if not defined %~2 goto :eof
setlocal enableDelayedExpansion
set "str=!%~2!"
goto :Echo.Color.2

:Echo.Color.Init
set "ECHO.COLOR=call :Echo.Color"
set "ECHO.DIR=%~dp0"
set "ECHO.FILE=%~nx0"
set "ECHO.FULL=%ECHO.DIR%%ECHO.FILE%"
:# Use prompt to store a backspace into a variable. (Actually backspace+space+backspace)
for /F "tokens=1 delims=#" %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "ECHO.DEL=%%a"
goto :eof

:main
call :Echo.Color 0a "a"
call :Echo.Color 0b "b"
set "txt=^" & call :Echo.Color.Var 0c txt
call :Echo.Color 0d "<"
call :Echo.Color 0e ">"
call :Echo.Color 0f "&"
call :Echo.Color 1a "|"
call :Echo.Color 1b " "
call :Echo.Color 1c "%%%%"
call :Echo.Color 1d ^"""
call :Echo.Color 1e "*"
call :Echo.Color 1f "?"
:# call :Echo.Color 2a "!"
call :Echo.Color 2b "."
call :Echo.Color 2c ".."
call :Echo.Color 2d "/"
call :Echo.Color 2e "\"
call :Echo.Color 2f "q:" /n
echo(
set complex="c:\hello world!/.\..\\a//^<%%>&|!" /^^^<%%^>^&^|!\
call :Echo.Color.Var 74 complex /n

exit /b

:# The following line must be last and not end by a CRLF.
-

PS. 前の例ではなかった「!」文字の出力に問題があるようです。(少なくとも、同じ症状は出ませんでした。) 調査中です。