• 분류 전체보기 (9)
    • Study (7)
      • CPP (4)
      • DataStructure (2)
      • Algorithm (0)
      • 기타 개발 팁 (1)
    • Diary (1)

블로그 메뉴

  • 홈
  • CPP
  • DataSturcture
  • Algorithm

공지사항

인기 글

태그

  • CPP
  • 프로그래밍 #windows #배치파일 #윈도우 #windows #batch #command
  • Queue
  • C++
  • IT
  • 컴퓨터
  • CS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
fredhur

fredhur's Tech Blog

Study/기타 개발 팁

Window batch script 콘솔 텍스트에 색깔 넣기

2022. 10. 23. 00:52

개요

리눅스 환경에서 셸 스크립트가 있듯이 윈도우에는 배치 스크립트가 있다. 확장자 .bat 으로 있는 파일인데 종종 봤을 수도 있다. 예컨대 현재 폴더의 파일들을 출력한다든지, 그 파일을 실행한다든지 하는 식의 스크립트 제작시 요긴하게 쓰인다. 시스템 부팅할때 여러종류의 배치파일이 실행하는 등 윈도우판 셸 스크립트이다.

 

윈도우 환경에서 개발하다보면 batch 파일을 만들일이 꽤 있는데 이를 더 예쁘게 하기 위해 출력창에 컬러를 넣어 보았다. 


윈도우 7 이후부터는 파워쉘을 통해 색깔 텍스트를 지원한다 그런데 이게 특정 컴퓨터에서는 무지 느린 이슈가 있었다...

분명히 원래 윈도우 콘솔에서도 컬러를 넣는 방법이 분명히 있었을텐데.. 하는 생각이 들었고 이에 알아보니 방법이 있었다.

이 글은 두가지 방식으로 배치 파일에 색깔을 넣는 방법을 소개하고 이를 좀더 쉽게 쓸 수 있도록 하는 방법을 서술하였다.

 

1. power shell 기능을 활용하는 방법 ( 요즘 방식 )

아래 방법은 power shell 기능을 통해 컬러를 넣는 방식이다.
윈도우 환경 pc 에서 해당 코드를 복사 붙여넣기 하고 확장자를 .bat 로 실행하면 화면을 볼 수 있다.

@echo off
rem 아래 방법은 echo 로 컬러텍스트를 넣는 방식이다.

rem foreground color : cyan
powershell write-host -fore Cyan This is Cyan text, foreground

rem background color : red
powershell write-host -back Red This is Red background

위 방식은 간단하고 명료하지만 특정 피씨 환경에서 배치 스크립트가 느린 이슈가 있었다.. 아무래도 파워쉘을 부르는게 아직은 버거운걸까..?
간단하지만 여러 고객사나 개발자들에게 공통 스크립트를 적용하는거에 있어서는 문제가 있었다. (느려서)

2. ansi 방식 (window 10 이후 부터)

Stack Over flow 답변

stack over flow 답변

 

How to echo with different colors in the Windows command line

I know that the color bf command sets the colors of the whole command line window but I wanted to to print one single line in a different color.

stackoverflow.com

stack over flow에 의하면 window 10 이전에는 native 로 콘솔에 컬러를 넣는 기능을 지원하지 않았다고 한다. 

window10 이후부터는 아래 처럼 ANSI color 를 ESC 를 통해서 지원한다고 한다. ( 2015 11월 이후)

그러나 문법이 다소 난해한것 같다.

 

@echo off
cls
echo [101;93m STYLES [0m
echo ^<ESC^>[0m [0mReset[0m
echo ^<ESC^>[1m [1mBold[0m
echo ^<ESC^>[4m [4mUnderline[0m
echo ^<ESC^>[7m [7mInverse[0m
echo.
echo [101;93m NORMAL FOREGROUND COLORS [0m
echo ^<ESC^>[30m [30mBlack[0m (black)
echo ^<ESC^>[31m [31mRed[0m
echo ^<ESC^>[32m [32mGreen[0m
echo ^<ESC^>[33m [33mYellow[0m
echo ^<ESC^>[34m [34mBlue[0m
echo ^<ESC^>[35m [35mMagenta[0m
echo ^<ESC^>[36m [36mCyan[0m
echo ^<ESC^>[37m [37mWhite[0m
echo.
echo [101;93m NORMAL BACKGROUND COLORS [0m
echo ^<ESC^>[40m [40mBlack[0m
echo ^<ESC^>[41m [41mRed[0m
echo ^<ESC^>[42m [42mGreen[0m
echo ^<ESC^>[43m [43mYellow[0m
echo ^<ESC^>[44m [44mBlue[0m
echo ^<ESC^>[45m [45mMagenta[0m
echo ^<ESC^>[46m [46mCyan[0m
echo ^<ESC^>[47m [47mWhite[0m (white)
echo.
echo [101;93m STRONG FOREGROUND COLORS [0m
echo ^<ESC^>[90m [90mWhite[0m
echo ^<ESC^>[91m [91mRed[0m
echo ^<ESC^>[92m [92mGreen[0m
echo ^<ESC^>[93m [93mYellow[0m
echo ^<ESC^>[94m [94mBlue[0m
echo ^<ESC^>[95m [95mMagenta[0m
echo ^<ESC^>[96m [96mCyan[0m
echo ^<ESC^>[97m [97mWhite[0m
echo.
echo [101;93m STRONG BACKGROUND COLORS [0m
echo ^<ESC^>[100m [100mBlack[0m
echo ^<ESC^>[101m [101mRed[0m
echo ^<ESC^>[102m [102mGreen[0m
echo ^<ESC^>[103m [103mYellow[0m
echo ^<ESC^>[104m [104mBlue[0m
echo ^<ESC^>[105m [105mMagenta[0m
echo ^<ESC^>[106m [106mCyan[0m
echo ^<ESC^>[107m [107mWhite[0m
echo.
echo [101;93m COMBINATIONS [0m
echo ^<ESC^>[31m                     [31mred foreground color[0m
echo ^<ESC^>[7m                      [7minverse foreground ^<-^> background[0m
echo ^<ESC^>[7;31m                   [7;31minverse red foreground color[0m
echo ^<ESC^>[7m and nested ^<ESC^>[31m [7mbefore [31mnested[0m
echo ^<ESC^>[31m and nested ^<ESC^>[7m [31mbefore [7mnested[0m

 

색깔을 넣거나 색깔에 배경색을 입히기 위해서는 

^<ESC^>[40m [40m<내가 색깔을 넣고 싶은 문장>[0m

 

이렇게 난해한 코드를 넣어야한다. 이 문제를 해결할 방법이 없을까 고민하니 아래와 같이 구성하면 될것 같아 해보았다.

@echo off

set ESC=



rem echo style text.
call :ECHO_RESET "RESET TEXT"
call :ECHO_BOLD "BOLD TEXT"
call :ECHO_UNDERLINE "UNDERLINE TEXT"
call :ECHO_INVERSE "INVERSE TEXT"

call :ECHO_NORMAL_FOREGROUND_BLACK "BLACK NORMAL FOREGROUND COLOR" 
call :ECHO_NORMAL_FOREGROUND_RED "RED NORMAL FOREGROUND COLOR"
call :ECHO_NORMAL_FOREGROUND_GREEN "GREEN NORMAL FOREGROUND COLOR"
call :ECHO_NORMAL_FOREGROUND_YELLOW "YELLOW NORMAL FOREGROUND COLOR"
call :ECHO_NORMAL_FOREGROUND_BLUE "BLUE NORMAL FOREGROUND COLOR"
call :ECHO_NORMAL_FOREGROUND_MAGENTA "MAGENTA NORMAL FOREGROUND COLOR"
call :ECHO_NORMAL_FOREGROUND_CYAN "CYAN NORMAL FOREGROUND COLOR"
call :ECHO_NORMAL_FOREGROUND_WHITE "WHITE NORMAL FOREGROUND COLOR"



pause

rem styles
:ECHO_RESET
echo %ESC%[0m %~1%ESC%[0m
exit /b

:ECHO_BOLD
echo %ESC%[1m %~1%ESC%[0m
exit /b

:ECHO_UNDERLINE
echo %ESC%[4m %~1%ESC%[0m
exit /b

:ECHO_Inverse
echo %ESC%[7m %~1%ESC%[0m
exit /b


rem normal foreground color
:ECHO_NORMAL_FOREGROUND_BLACK
echo %ESC%[30m%~1%ESC%[0m
exit /b

:ECHO_NORMAL_FOREGROUND_RED
echo %ESC%[31m%~1%ESC%[0m
exit /b

:ECHO_NORMAL_FOREGROUND_GREEN
echo %ESC%[32m%~1%ESC%[0m
exit /b

:ECHO_NORMAL_FOREGROUND_YELLOW
echo %ESC%[33m%~1%ESC%[0m
exit /b

:ECHO_NORMAL_FOREGROUND_BLUE
echo %ESC%[34m%~1%ESC%[0m
exit /b

:ECHO_NORMAL_FOREGROUND_MAGENTA
echo %ESC%[35m%~1%ESC%[0m
exit /b

:ECHO_NORMAL_FOREGROUND_CYAN
echo %ESC%[36m%~1%ESC%[0m
exit /b

:ECHO_NORMAL_FOREGROUND_WHITE
echo %ESC%[37m%~1%ESC%[0m
exit /b

: ECHO_NORMAL_FOREGROUND_RED

 

이런식으로 일종의 함수화를 하였다. %~1% 를 이용하여 색깔을 입히고 싶은 텍스트를 넘겨준다.

ESC 를 실제 escape 문자로 삽입을 해야하는데 시스템에 따라서 해당 문자열 복사가 약간 어렵다. 위 코드를 그대로 복붙하여 notepad 에 넣으면 위랑 다른 문자가 나온다. 

 

어쨌든 위와 같이 함수화를 하게 되면 readability 가 좋아지면서 batch file에 예쁘게 색깔을 넣을 수 있게 만들 수 있다.

위와 같은 방식으로 텍스트에 색깔입히는게 제일 깔끔하고 좋은 것 같다. 단 window 10 이후부터...

 

 

저작자표시 (새창열림)
    fredhur
    fredhur

    티스토리툴바