web-dev-qa-db-ja.com

Windowsコマンドラインでさまざまな色でエコーする方法

color bfコマンドはコマンドラインウィンドウ全体の色を設定することを知っていますが、1つの行を別の色で印刷したかったのです。

166
rui

単一の行を別の色で印刷したかった。

ANSIエスケープシーケンスを使用します。

10より前のWindows-コンソールでのANSIカラーのネイティブサポートなし

Windowsバージョン10未満の場合、Windowsコマンドコンソールはデフォルトで出力の色付けをサポートしません。 CmderConEmANSICON または Mintty (GitBashおよびCygwinでデフォルトで使用)のいずれかをインストールできます。 Windowsコマンドコンソールにカラーリングサポートを追加します。

Windows 10-コマンドラインの色

Windows 10以降、Windowsコンソールは、デフォルトでANSIエスケープシーケンスと一部の色をサポートしています。この機能は、2015年11月のThreshold 2 Updateと共に出荷されました。

MSDNドキュメント

Update(05-2019): ColorTool を使用すると、コンソールの配色を変更できます。これは、Microsoft Terminal プロジェクトの一部です。

デモ

enter image description here

バッチコマンド

win10colors.cmdMichele Locati によって書かれました:

@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
207
Jens A. Koch

これは自己コンパイルbat/.netハイブリッド.BATとして保存する必要があります)で、.netフレームワークをインストールしたシステムで使用できます(最も古いXP/2003インストールでも、.NETフレームワークのないウィンドウが表示されることはまれです。 jscript.netコンパイラを使用して、現在の行に対してのみ異なる背景/前景色で文字列を印刷できるexeを作成します。

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)

%~n0.exe %*

endlocal & exit /b %errorlevel%

*/

import System;

var arguments:String[] = Environment.GetCommandLineArgs();

var newLine = false;
var output = "";
var foregroundColor = Console.ForegroundColor;
var backgroundColor = Console.BackgroundColor;
var evaluate = false;
var currentBackground=Console.BackgroundColor;
var currentForeground=Console.ForegroundColor;


//http://stackoverflow.com/a/24294348/388389
var jsEscapes = {
  'n': '\n',
  'r': '\r',
  't': '\t',
  'f': '\f',
  'v': '\v',
  'b': '\b'
};

function decodeJsEscape(_, hex0, hex1, octal, other) {
  var hex = hex0 || hex1;
  if (hex) { return String.fromCharCode(parseInt(hex, 16)); }
  if (octal) { return String.fromCharCode(parseInt(octal, 8)); }
  return jsEscapes[other] || other;
}

function decodeJsString(s) {
  return s.replace(
      // Matches an escape sequence with UTF-16 in group 1, single byte hex in group 2,
      // octal in group 3, and arbitrary other single-character escapes in group 4.
      /\\(?:u([0-9A-Fa-f]{4})|x([0-9A-Fa-f]{2})|([0-3][0-7]{0,2}|[4-7][0-7]?)|(.))/g,
      decodeJsEscape);
}


function printHelp( ) {
   print( arguments[0] + "  -s string [-f foreground] [-b background] [-n] [-e]" );
   print( " " );
   print( " string          String to be printed" );
   print( " foreground      Foreground color - a " );
   print( "                 number between 0 and 15." );
   print( " background      Background color - a " );
   print( "                 number between 0 and 15." );
   print( " -n              Indicates if a new line should" );
   print( "                 be written at the end of the ");
   print( "                 string(by default - no)." );
   print( " -e              Evaluates special character " );
   print( "                 sequences like \\n\\b\\r and etc ");
   print( "" );
   print( "Colors :" );
   for ( var c = 0 ; c < 16 ; c++ ) {

        Console.BackgroundColor = c;
        Console.Write( " " );
        Console.BackgroundColor=currentBackground;
        Console.Write( "-"+c );
        Console.WriteLine( "" );
   }
   Console.BackgroundColor=currentBackground;



}

function errorChecker( e:Error ) {
        if ( e.message == "Input string was not in a correct format." ) {
            print( "the color parameters should be numbers between 0 and 15" );
            Environment.Exit( 1 );
        } else if (e.message == "Index was outside the bounds of the array.") {
            print( "invalid arguments" );
            Environment.Exit( 2 );
        } else {
            print ( "Error Message: " + e.message );
            print ( "Error Code: " + ( e.number & 0xFFFF ) );
            print ( "Error Name: " + e.name );
            Environment.Exit( 666 );
        }
}

function numberChecker( i:Int32 ){
    if( i > 15 || i < 0 ) {
        print("the color parameters should be numbers between 0 and 15");
        Environment.Exit(1);
    }
}


if ( arguments.length == 1 || arguments[1].toLowerCase() == "-help" || arguments[1].toLowerCase() == "-help"   ) {
    printHelp();
    Environment.Exit(0);
}

for (var arg = 1; arg <= arguments.length-1; arg++ ) {
    if ( arguments[arg].toLowerCase() == "-n" ) {
        newLine=true;
    }

    if ( arguments[arg].toLowerCase() == "-e" ) {
        evaluate=true;
    }

    if ( arguments[arg].toLowerCase() == "-s" ) {
        output=arguments[arg+1];
    }


    if ( arguments[arg].toLowerCase() == "-b" ) {

        try {
            backgroundColor=Int32.Parse( arguments[arg+1] );
        } catch(e) {
            errorChecker(e);
        }
    }

    if ( arguments[arg].toLowerCase() == "-f" ) {
        try {
            foregroundColor=Int32.Parse(arguments[arg+1]);
        } catch(e) {
            errorChecker(e);
        }
    }
}

Console.BackgroundColor = backgroundColor ;
Console.ForegroundColor = foregroundColor ;

if ( evaluate ) {
    output=decodeJsString(output);
}

if ( newLine ) {
    Console.WriteLine(output);  
} else {
    Console.Write(output);

}

Console.BackgroundColor = currentBackground;
Console.ForegroundColor = currentForeground;

ヘルプメッセージは次のとおりです。

enter image description here

coloroutput.bat -s "aa\nbb\n\u0025cc" -b 10 -f 3 -n -e

このスクリプトを見つけることもできます here

Carlosの色関数も確認できます-> http://www.dostips.com/forum/viewtopic.php?f=3&t=445

49
npocmaka

これはすばらしい答えではありませんが、ターゲットワークステーションにPowershellがあることがわかっている場合は、次のようなことができます(BAT/CMDスクリプトを想定):

CALL:ECHORED "Print me in red!"

:ECHORED
%Windir%\System32\WindowsPowerShell\v1.0\Powershell.exe write-Host -foregroundcolor Red %1
goto:eof

編集: (簡単になりました!)

それは古い答えですが、私は少し明確にして簡略化すると思いました

img

PowerShell は現在 includedすべてのバージョンで 7以降のWindowsです。したがって、この回答の構文はより単純なものに短縮できます。形:

  • pathは、環境変数に既にあるはずなので、指定する必要はありません。
  • unambiguousコマンドは 省略形 にできます。たとえば、次のことができます。
    • -foreの代わりに-foregroundcolorを使用します
    • -backの代わりに-backgroundcolorを使用します
  • コマンドは基本的にechoの代わりに 'inline'を使用することもできます
    (上記のように個別のバッチファイルを作成するのではなく)。

例:

powershell write-Host -fore Cyan This is Cyan text
powershell write-Host -back Red This is Red background

詳しくは:

色と詳細情報の完全なリストは、
-PowerShell Write-Hostのドキュメント

40
Iain

印刷するWordの名前でファイルを作成し、カラーで印刷できるfindstrを使用して、ファイルを消去できます。この例を試してください:

@echo off
SETLOCAL EnableDelayedExpansion
for /F "tokens=1,2 delims=#" %%a in ('"Prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set "DEL=%%a"
)

call :ColorText 0a "green"
call :ColorText 0C "red"
call :ColorText 0b "cyan"
echo(
call :ColorText 19 "blue"
call :ColorText 2F "white"
call :ColorText 4e "yellow"

goto :eof

:ColorText
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
goto :eof

color /?を実行して、色のリストを取得します。

17
Tutankhamen

ANSICON を使用して、最新のWindowsでANSI端末コードを有効にできます。 Windows XPおよびWindows 7で使用した32ビットバージョンと64ビットバージョンがあります。

13
Bryan Ash

Windows 10-TH2以降:

コマンドプロンプトで:

echo ^[[32m HI ^[[0m

実際のキーの使用:echo Ctrl+[[32m HICtrl+[[0mEnter

その下に緑色の「HI」が表示されます。

コード番号は次の場所にあります。

メモ帳:

これをメモ帳に保存するには、次を使用してESCと入力します。 Altテンキーで+027、次に[32mの部分。私がラップトップにいたときの別のトリックは、上の行をファイルにリダイレクトして開始し、カットアンドペーストします:

echo echo ^[[32m HI ^[[0m >> batch_file.cmd
11
Gringo Suave

私もcmdに適切な色付けがないことに悩まされていたので、先に進んでcmdcolorを作成しました。 ANSI/VT100制御シーケンスの限られたセット(つまり、bashのような)、つまりecho \033[31m RED \033[0m DEFAULT | cmdcolor.exeを探すstdoutプロキシにすぎません。

使用方法とダウンロード

6

Win7 Batchファイルにいくつかの単純なテキストカラーを導入したかったので、これを見てみました。これが私が思いついたものです。ご協力いただきありがとうございます。

@echo off
cls && color 08

rem .... the following line creates a [DEL] [ASCII 8] [Backspace] character to use later
rem .... All this to remove [:]
for /F "tokens=1,2 delims=#" %%a in ('"Prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (set "DEL=%%a")

echo.

<nul set /p="("
call :PainText 09 "BLUE is cold"    && <nul set /p=")  ("
call :PainText 02 "GREEN is earth"  && <nul set /p=")  ("
call :PainText F0 "BLACK is night"  && <nul set /p=")"
echo.
<nul set /p="("
call :PainText 04 "RED is blood"    && <nul set /p=")  ("
call :PainText 0e "YELLOW is pee"   && <nul set /p=")  ("
call :PainText 0F "WHITE all colors"&& <nul set /p=")"

goto :end

:PainText
<nul set /p "=%DEL%" > "%~2"
findstr /v /a:%1 /R "+" "%~2" nul
del "%~2" > nul
goto :eof

:end
echo.
pause
5
Nick-n-Chicago

別の方法は、NodeJSを使用することです。

以下に例を示します。

const os = require('os');
const colors = require('colors');

console.log("Operative System:".green,os.type(),os.release());
console.log("Uptime:".blue,os.uptime());

そして、これが結果です:

enter image description here

1
Josem

cechoを使用することもできます。comまたは.exeを持ち歩く必要がないように、スクリプトに直接埋め込むこともできます。

http://www.codeproject.com/Articles/17033/Add-Colors-to-Batch-Files

1
Brian Gleason

テキストの色を変更するには、ANSIエスケープコードシーケンスをエコーする必要があります。 http://en.wikipedia.org/wiki/ANSI_escape_code

これらのエスケープコードのもう1つの非常に優れたソースは、 http://ascii-table.com/ansi-escape-sequences.php です。

0

デスクトップのColourText.basというファイルに次の行を追加します。

Imports System
Imports System.IO
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

Public Module MyApplication  
Public Declare Function GetStdHandle Lib "kernel32" Alias "GetStdHandle" (ByVal nStdHandle As Long) As Long
Public Declare Function SetConsoleTextAttribute Lib "kernel32" Alias "SetConsoleTextAttribute" (ByVal hConsoleOutput As Long, ByVal wAttributes As Long) As Long
Public Const STD_ERROR_HANDLE = -12&
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&

Sub Main()
    Dim hOut as Long
    Dim Ret as Long
    Dim Colour As Long
    Dim Colour1 As Long
    Dim Text As String
    hOut  = GetStdHandle(STD_OUTPUT_HANDLE)
    Colour = CLng("&h" & Split(Command(), " ")(0))
    Colour1 = Clng("&h" & Split(Command(), " ")(1))
    Text = Mid(Command(), 7)
    Ret = SetConsoleTextAttribute(hOut,  Colour)
    Console.Out.WriteLine(text)
    Ret = SetConsoleTextAttribute(hOut, Colour1)
End Sub
End Module

保存して、コマンドプロンプトに次のように入力します。

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /target:exe /out:"%userprofile%\desktop\ColourText.exe" "%userprofile%\desktop\ColourText.bas" /verbose

ColourText.exeというファイルがデスクトップに表示されます。 Windowsフォルダーに移動

使用するには、2つの文字コードを使用して色を設定する必要があります(例:01ではなく、1)。

ColourText ColourOfText ColourOfTextWhenFinished Text

EGテキストを渡さずに白に青を設定し、白のテキストに赤を設定し、グレーに青を設定します。

ColourText F1 F1
ColourText F2 71 This is green on white

または

ColourText F1 F1
cls
ColourText F4 F4
Echo Hello
Echo Hello today
ColourText F1 F1

CLSコマンドも興味深いものになります。パラメータなしのColorコマンドは、すべての色を起動時の色にリセットします。

色コードを取得するには、次の数字を一緒に追加します。プログラマモードで電卓を使用します。これらは16進数です。これらは一緒に追加できます。たとえば、赤+青+ FG強度= 13 =D。10+を使用しなかったため、背景は黒になります。カラーコードは2文字にする必要があります。たとえば、08ではなく8です。

FOREGROUND_RED = &H4     '  text color contains red.
FOREGROUND_INTENSITY = &H8     '  text color is intensified.
FOREGROUND_GREEN = &H2     '  text color contains green.
FOREGROUND_BLUE = &H1     '  text color contains blue.
BACKGROUND_BLUE = &H10    '  background color contains blue.
BACKGROUND_GREEN = &H20    '  background color contains green.
BACKGROUND_INTENSITY = &H80    '  background color is intensified.
BACKGROUND_RED = &H40    '  background color contains red.
0
user6017774

これをWindows 10で機能させるには、このフラグを有効にします:ENABLE_VIRTUAL_TERMINAL_PROCESSING

このレジストリキーを使用すると、デフォルトでこれを設定できます

[HKCU\Console] VirtualTerminalLevel dword 0x1

0
Michel de Groot

Glenn Slaydenこの回答 で述べたように、レジストリに適切な値を追加して、cmdを「よりカラフル」にすることができます。

幸いなことに、グローバルなデフォルトはオプトインからオプトアウトに変更できます。 HKEY_CURRENT_USER\Console\VirtualTerminalLevelのレジストリキーは、ANSIエスケープシーケンスを処理するためのグローバルなデフォルト動作を設定します。 DWORDキーを(必要に応じて)作成し、その値を1に設定して、デフォルトでANSI処理をグローバルに有効にします(または0で無効にします)。

0
hawk1337