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


217

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


1
エスケープされたカラーコードをWindowsコマンドラインに追加する簡単な方法はないようです。:(
rui

Win10が許容できるOSのバージョンであれば、RUI、イェンスの答えをチェックアウト-それはあなたが7年前に答えを受け入れたことがないこの質問として見て、必要な正確に何であるべき:stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck

回答:


284

1行を別の色で印刷したいと思っていました。

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

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

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

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

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

MSDNドキュメント

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

デモ

ここに画像の説明を入力してください

バッチコマンド

win10colors.cmd書かれたミケーレ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

11
@Jens A. Koch-Windows 10コンソール(cmd)で機能していません
user3057544

40
OK。フィードバックをお寄せいただきありがとうございます。.cmdまたは.bat-両方とも動作するはずです。しかし、私はそれが機能しない理由を知っていると思います:StackOverflowに投稿するときにエスケープシンボルが削除されているようです。代わりに、ここからコンテンツを使用し、私の答えからコンテンツをコピーしないでください。gist.githubusercontent.com/mlocati/...を
イェンスA.コッホ

28
ESC以前にメモ帳++でインを生成する必要はありませんでした...テンキーと左のALTキーを使用してALTコードでこれを行うことができます:L-ALT+ 0+ 2+7
kayleeFrye_onDeck

3
ところで、多くのバッチをほとんどの日に作成して使用する人として、この回答は私の全体的なツールセットを美的な方法で強化しました!VBを使用していますか?地獄。これは、移動するための方法!
kayleeFrye_onDeck 2017年

4
あなたは生成することができますESCバッチファイル内の文字をこのように:for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini

56

これは.netフレームワークがインストールされているシステムで使用できる自己コンパイルされたbat / .netハイブリッド(として保存する必要があります.BAT)(最も古い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;

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

ここに画像の説明を入力してください

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

このスクリプトはここにもあります。

カルロスのカラー関数を確認することもできます-> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453


13
それはなんてクールなことでしょう。含まれているjscriptをコンパイルするbatファイル。必要な場合のみ-感心しました。使用されるのを待っているjscriptコンパイラがそこにあることさえ知らなかった。あなたは今月の私の「素晴らしい賞」を受け取ります。(コンパイルのため)最初に使用すると処理が遅くなることに注意してください。
グラハム

4
私はこの極端に行くほど色を必要としませんが、テクニックは本当に印象的で、自分が他の場所でそれを使用しているのを見ることができます。
EM0

47

これは良い答えではありませんが、ターゲットワークステーションに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は7以降、すべてのバージョンのWindowsに含まれています。したがって、この回答の構文はより単純な形式に短縮できます。

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

例:

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

詳しくは:

色とより多くの情報の完全なリストはで利用可能です
- PowerShellのためのドキュメントWrite-Host



14
グレート、それは私のために働きます、しかしそれはtooooooooooooooo遅いです。
2014年

4
私はこれが解決策を提供する答えであることを理解していますが、powershell?うん。
SgtPooki 2014年

2
それで「これはいい答えじゃない」から始めました。私はPowershellがかなり好きですが、これではやり過ぎです。ANSICONは、ターゲットマシンへの展開に対応できる場合に適しています。
Iain

この回答をありがとうございます。Powershellのバッチファイルから色付きの出力をエコーする方法を探してみましたが、これが唯一のものでした。実際に印刷するのに長い時間がかかる理由はわかりません(呼び出しごとに1秒待機するようなものです)が、少なくとも私はそれを実行できます。ありがとうございました!
ピザフィルム

29

Windows 10-TH2以降:

(別名バージョン1511、ビルド10586、リリース2015-11-10)

コマンドプロンプト:

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

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

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

コード番号はここにあります:

メモ帳:

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

echo echo ^[[32m HI ^[[0m >> batch_file.cmd

3
Alt + 027はまさに私が必要としていたものです!
Aleksander Stelmaczonek 2018

1
Alt + 027はEclipse / Javaで動作し\033ません。
derHugo

Windows 10以降では、これはDOSおよびNotepad ++エディターで機能します。ありがとう!
ジュニアメイヘ

17

印刷する単語の名前でファイルを作成し、カラーで印刷できる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 /?して色のリストを取得します。


3
これにより、Windowsコマンドラインで色が設定されます。それが何をするのか説明してもらえますか?
FeatureCreep 2014

2
わかりました。印刷する単語の名前でファイルを作成し、カラーで印刷できるfindstrを使用して、ファイルを消去します。
FeatureCreep

2
それは印象的です!色コードが間違っていることに注意してください。「color /?」を実行します 実際のカラーコードを確認してください。
ヨーヨー、2015年

3
findstrはファイル名のみを色付けできることに注意してください。つまり、不正なパス文字を含む文字列に対してこのトリックを使用することはできません。
ヨーヨー、2015年

3
また、印刷しようとしているものの名​​前をファイルが共有している場合、同じディレクトリにあるファイルが上書きされることに注意してください...それはまったく良くありません。
BrainSlugs83

14

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


Windows 8.1では動作しません。インストールしようとするたびにクラッシュする。
EHerman 2014年

@EHerman多分この質問は役に立ちます。
ブライアンアッシュ

ANSICONは、Windows 10以降のバージョンでは必要ありません。そこで使用しないでください。
Gringo Suave

6

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

使い方とダウンロード


これはかっこいいです、そして私はそれを私の巨大なビルドスクリプトのメニューシステムに入れました。私が持っている唯一の牛肉は、そのページで提供するバイナリが64ビットを対象としているため、32ビットのビルドマシンでは機能しません。しかし、ソースを取得して自分でコンパイルするだけで問題ありませんでした。
水田

:しかし、それは、32ビット:)ここではGNUファイルの出力だだcmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
アレックMEV

それは奇妙なことです... XP Proは実行を拒否しましたが、私のWin7 64ボックスでは問題なく動作しました。Win32をターゲットにしてVisual C ++でコンパイルしましたが、問題ありませんでした。
水田

ええと...おそらくのためupx。メールで連絡してもらえますか?
Alec Mev 2014

6

これは、Win7バッチファイルにいくつかの単純なテキストの色を導入したかったためです。これが私が思いついたものです。ご協力いただきありがとうございます。

@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

すでに250を超える賛成投票で承認された回答があります。私がまだ貢献している理由は、escapeエコーに必要な文字が多くのエディターで受け入れられていないため(たとえば、MS Codeを使用しています)、他のすべてのソリューションにはサードパーティ(Windows以外のデフォルト)のソフトウェアが必要なためです。

プレーンバッチコマンドのみを使用する回避策は、のPROMPT代わりにを使用することですECHOPROMPTコマンドは受け入れescapeとして任意のエディタに優しい方法で、文字$Eの文字列を。(単に置き換えるEscASCIIエスケープコードを持ちます)$E

ここにデモコードがあります:

@ECHO OFF

    :: Do not pollute environment with the %prompt.bak% variable
    :: ! forgetting ENDLOCAL at the end of the batch leads to prompt corruption
    SETLOCAL

    :: Old prompt settings backup
    SET prompt.bak=%PROMPT%

    :: Entering the "ECHO"-like section

        :: Forcing prompt to display after every command (see below)
        ECHO ON

        :: Setting the prompt using the ANSI Escape sequence(s)
        :: - Always start with $E[1A, otherwise the text would appear on a next line
        :: - Then the decorated text follows
        :: - And it all ends with $E30;40m, which makes the following command invisible
        ::   - assuming default background color of the screen
        @ PROMPT $E[1A$E[30;42mHELLO$E[30;40m

        :: An "empty" command that forces the prompt to display. 
        :: The word "rem" is displayed along with the prompt text but is made invisible
        rem

        :: Just another text to display
        @ PROMPT $E[1A$E[33;41mWORLD$E[30;40m
        rem

        :: Leaving the "ECHO"-like section
        @ECHO OFF

    :: Or a more readable version utilizing the cursor manipulation ASCII ESC sequences

        :: the initial sequence
        PROMPT $E[1A
        :: formating commands
        PROMPT %PROMPT%$E[32;44m
        :: the text
        PROMPT %PROMPT%This is an "ECHO"ed text...
        :: new line; 2000 is to move to the left "a lot"
        PROMPT %PROMPT%$E[1B$E[2000D
        :: formating commands fro the next line
        PROMPT %PROMPT%$E[33;47m
        :: the text (new line)
        PROMPT %PROMPT%...spreading over two lines
        :: the closing sequence
        PROMPT %PROMPT%$E[30;40m

        :: Looks like this without the intermediate comments:
        :: PROMPT $E[1A
        :: PROMPT %PROMPT%$E[32;44m
        :: PROMPT %PROMPT%This is an "ECHO"ed text...
        :: PROMPT %PROMPT%$E[1B$E[2000D
        :: PROMPT %PROMPT%$E[33;47m
        :: PROMPT %PROMPT%...spreading over two lines
        :: PROMPT %PROMPT%$E[30;40m

        :: show it all at once!
        ECHO ON
        rem
        @ECHO OFF

    :: End of "ECHO"-ing

    :: Setting prompt back to its original value
    :: - We prepend the settings with $E[37;40m in case
    ::   the original prompt settings do not specify color
    ::   (as they don't by default).
    :: - If they do, the $E[37;40m will become overridden, anyway.
    :: ! It is important to write this command 
    ::   as it is with `ENDLOCAL` and in the `&` form.
    ENDLOCAL & PROMPT $E[37;40m%prompt.bak%

EXIT /B 0

注:唯一の欠点は、color明示的に知られていない場合、この手法がユーザーのcmdカラー設定(コマンドまたは設定)と競合することです。

-冒頭で述べた理由のために私にとって受け入れ可能な唯一のソリューションであるため、これが役立つことを願っています。-

編集:

コメントに基づいて、@ Jebに触発された別のスニペットを同封します。それ:

  • (エディターに入力するのではなく)「Esc」文字ランタイムを取得して使用する方法を示します(Jebのソリューション)
  • 「ネイティブ」ECHOコマンドを使用します
  • だからそれはローカルなPROMPT値には影響しません
  • ECHO出力の色付けは必然的にPROMPT色に影響するため、とにかく色をリセットする必要があることを示します
@ECHO OFF

    :: ! To observe color effects on prompt below in this script
    ::   run the script from a fresh cmd window with no custom
    ::   prompt settings

    :: Only not to pollute the environment with the %\e% variable (see below)
    :: Not needed because of the `PROMPT` variable
    SETLOCAL

        :: Parsing the `escape` character (ASCII 27) to a %\e% variable
        :: Use %\e% in place of `Esc` in the [http://ascii-table.com/ansi-escape-sequences.php]
        FOR /F "delims=#" %%E IN ('"prompt #$E# & FOR %%E IN (1) DO rem"') DO SET "\e=%%E"

        :: Demonstrate that prompt did not get corrupted by the previous FOR
        ECHO ON
        rem : After for
        @ECHO OFF

        :: Some fancy ASCII ESC staff
        ECHO [          ]
        FOR /L %%G IN (1,1,10) DO (
            TIMEOUT /T 1 > NUL
            ECHO %\e%[1A%\e%[%%GC%\e%[31;43m.
            ECHO %\e%[1A%\e%[11C%\e%[37;40m]
        )

        :: ECHO another decorated text
        :: - notice the `%\e%[30C` cursor positioning sequence
        ::   for the sake of the "After ECHO" test below
        ECHO %\e%[1A%\e%[13C%\e%[32;47mHELLO WORLD%\e%[30C

        :: Demonstrate that prompt did not get corrupted by ECHOing
        :: neither does the cursor positioning take effect.
        :: ! But the color settings do.
        ECHO ON
        rem : After ECHO
        @ECHO OFF

    ENDLOCAL

    :: Demonstrate that color settings do not reset
    :: even when out of the SETLOCAL scope
    ECHO ON
    rem : After ENDLOCAL
    @ECHO OFF

    :: Reset the `PROMPT` color
    :: - `PROMPT` itself is untouched so we did not need to backup it.
    :: - Still ECHOING in color apparently collide with user color cmd settings (if any).
    :: ! Resetting `PROMPT` color this way extends the `PROMPT`
    ::   by the initial `$E[37;40m` sequence every time the script runs.
    :: - Better solution then would be to end every (or last) `ECHO` command
    ::   with the `%\e%[37;40m` sequence and avoid setting `PROMPT` altogether.
    ::   which makes this technique preferable to the previous one (before EDIT)
    :: - I am keeping it this way only to be able to
    ::   demonstrate the `ECHO` color effects on the `PROMPT` above.
    PROMPT $E[37;40m%PROMPT%

    ECHO ON
    rem : After PROMPT color reset
    @ECHO OFF

EXIT /B 0

とても面白いテクニック。github.com/VonC/batcolorsを更新する必要があるかどうかを確認します。賛成。
VonC

@VonCエディタに入力する必要なく、エスケープチャットを含む変数を簡単に作成できます。for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
ジェブ

@jeb「batcolors / echo.batでecho使用するのではなく」という意味ですか?
VonC

@VonCはい、あなたを置き換えるset ASCII27=←for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E"。これは、プロンプトを永続的に変更せずに(promptコマンドが子プロセスで実行されるため)、promptコマンドによって作成されたエスケープ文字を使用します。ところで あなたはechos.bat...いくつかの最適化の可能性を秘めている
ジェブ

@jeb "あなたのechos.batにはある程度の最適化の可能性があります":私はそれを確信しています:)プルリクエストは歓迎されます(ASCII27と他の最適化の両方で)
VonC

4

上記のコメントで指摘されている問題に対処するための回答を追加します。そのインラインansiカラーコードは、FORループ内(実際には、括弧で囲まれたコードブロック内)で誤動作する可能性があります。 以下の.batコードは、(1)インラインカラーコードの使用、(2)インラインカラーコードがFORループまたは括弧で囲まれたコードブロック内で使用された場合に発生する可能性があるカラーエラー、および(3)の解決策を示しています。問題。 .batコードが実行されると、テスト2と3はカラーコードの失敗を示し、テスト4はソリューションを実装しているため失敗はありません。

[編集2020-04-07:サブルーチンを呼び出すよりもおそらくもっと効率的な別の解決策を見つけました。次の行のように、FINDSTR句を括弧で囲みます。

   echo success | (findstr /R success)

ENDEDIT]

注:私の(制限された)経験では、カラーコードの問題は、入力がコードブロック内のFINDSTRにパイプされた後にのみ現れます。これが、次の.batが問題を再現する方法です。 色コードの問題は、FINDSTRにパイプした後よりも一般的である可能性があります。誰かが問題の性質を説明できて、それを解決するより良い方法があれば、私はそれを感謝します。

@goto :main
:resetANSI
EXIT /B
rem  The resetANSI subroutine is used to fix the colorcode
rem  bug, even though it appears to do nothing.

:main
@echo off
setlocal EnableDelayedExpansion

rem  Define some useful colorcode vars:
for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ESCchar=%%E"
set "green=%ESCchar%[92m"
set "yellow=%ESCchar%[93m"
set "magenta=%ESCchar%[95m"
set "cyan=%ESCchar%[96m"
set "white=%ESCchar%[97m"
set "black=%ESCchar%[30m"

echo %white%Test 1 is NOT in a FOR loop nor within parentheses, and color works right.
   echo %yellow%[Test 1] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   echo %magenta%This is magenta and FINDSTR found and displayed 'success'.%yellow%
   echo %green%This is green.
echo %cyan%Test 1 completed.

echo %white%Test 2 is within parentheses, and color stops working after the pipe to FINDSTR.
(  echo %yellow%[Test 2] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   echo %magenta%This is supposed to be magenta and FINDSTR found and displayed 'success'.
   echo %green%This is supposed to be green.
)
echo %cyan%Test 2 completed.

echo %white%Test 3 is within a FOR loop, and color stops working after the pipe to FINDSTR.
for /L %%G in (3,1,3) do (
   echo %yellow%[Test %%G] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   echo %magenta%This is supposed to be magenta and FINDSTR found and displayed 'success'.
   echo %green%This is supposed to be green.
)
echo %cyan%Test 3 completed.

echo %white%Test 4 is in a FOR loop but color works right because subroutine :resetANSI is 
echo called after the pipe to FINDSTR, before the next color code is used.
for /L %%G in (4,1,4) do (
   echo %yellow%[Test %%G] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   call :resetANSI
   echo %magenta%This is magenta and FINDSTR found and displayed 'success'.
   echo %green%This is green.
)
echo %cyan%Test 4 completed.%white%

EXIT /B


1

Win 7 HomeからWin 10 Proに変換し、他のバッチから呼び出したバッチを置き換えて、情報をカラーでエコーしたいと思いました。上記の内容を確認すると、以前のバッチを直接置き換える次のものを使用します。スペースを含むメッセージを使用できるように、メッセージに「〜」を追加することに注意してください。コードを覚える代わりに、必要な色の文字を使用します。

%2にスペースが含まれている場合は、「...」が必要です。%1黒に強い色:R =赤G =緑Y =黄色W =白

ECHO OFF
IF "%1"=="R" ECHO ^[91m%~2[0m
IF "%1"=="G" ECHO ^[92m%~2[0m
IF "%1"=="Y" ECHO ^[93m%~2[0m
IF "%1"=="W" ECHO ^[97m%~2[0m

0

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

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


それは本当に有望に見えますが、エコーコマンドでエスケープ文字-ASCII 27を出力するにはどうすればよいですか?
rui

10
Windowsコンソールはターミナルエミュレータではありません。ANSIエスケープシーケンスは機能しません。あなたはANSI.SYSをロードすることによってそうするようにWindows 9xを同軸化することができましたが、今ではそれを少し過ぎています。
Joey

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文字でなければなりませ088

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.

2
興味深いことに、誰もがSDKをインストールするわけではありませんが、実際には非常に少数の人しかいないと思います。
アベル

0

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

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

[HKCU\Console] VirtualTerminalLevel dword 0x1


0

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

次に例を示します。

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

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

そしてこれが結果です:

ここに画像の説明を入力してください


0

グレンSlaydenはで言ったこの答えは、CMD「よりカラフル」にするために、レジストリに適切な値を追加することができます。

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


0

powershellのログステートメントに色を設定することは大したことではありません。-ForegroundColorパラメータ を使用できます。

確認メッセージを書きます。

Write-Host "Process executed Successfully...." -ForegroundColor Magenta

エラーメッセージを書きます。

Write-Host "Sorry an unexpected error occurred.." -ForegroundColor Red

進捗メッセージを書く

Write-Host "Working under pocess..." -ForegroundColor Green

0
call :color_echo "blue" "blue txt"
call :color_echo "red" "red txt"
echo "white txt"


REM : https://www.robvanderwoude.com/ansi.php
:color_echo
    @echo off

    set "color=%~1"
    set "txt=%~2"

    set ESC=
    set black=%ESC%[30m
    set red=%ESC%[31m
    set green=%ESC%[32m
    set yellow=%ESC%[33m
    set blue=%ESC%[34m
    set magenta=%ESC%[35m
    set cyan=%ESC%[36m
    set white=%ESC%[37m

    if "%~1" == "black"   set "color=!black!"
    if "%~1" == "red"     set "color=!red!"
    if "%~1" == "green"   set "color=!green!"
    if "%~1" == "yellow"  set "color=!yellow!"
    if "%~1" == "blue"    set "color=!blue!"
    if "%~1" == "magenta" set "color=!magenta!"
    if "%~1" == "cyan"    set "color=!cyan!"
    if "%~1" == "white"   set "color=!white!"

    echo | set /p="!color!!txt!"
    echo.

    REM : return to standard white color
    echo | set /p="!white!"

    REM : exiting the function only
    EXIT /B 0

%ESC%空なので、これは機能しません。echo !white!色を白に設定します。デフォルトの色に戻すには(ユーザー設定が何であれ):colorパラメーターなしのコマンドはそれを行います。
ステファン

-1

私たちはこれをANSI端末コードで行っていました。それでも機能するかどうかはわかりませんが、試すことができます。


1
これらのANSI端末コードの使用方法を説明している場合、これは良い回答になる可能性があります...
Davor Josipovic '24

1
私がリンクした記事はそれを説明していると思いました。読んだ?ところで:それは彼らがwin32で動作しないと言います。
マイケルJ

斜めに。この記事ではANSI端末コードについて説明していますが、実際にはcmd内からそれらを使用する方法を説明していないため、質問に答えてください。(はい... Win32コンソールがサポートされていないという事実は、それらを質問とは無関係にします。)
Davor Josipovic '28

1
ANSIコードを端末にエコーするだけです。たとえば、「echo←[6m」は、端末のテキストの色を6(赤)に設定します。「←」はASCII 27(エスケープ)であることに注意してください。「ALT」を押しながらテンキーで「27」と入力することで入力できます。私はそれをグーグルで調べたところ、「color」コマンドを使用しても同じことができることがわかりました(数値コードは異なります)。「color 4」は赤いテキストを取得します。
マイケルJ

-6

colorコマンドを使用して、コンソール全体の色を変更できます

Color 0F

白黒です

Color 0A 

黒と緑です


20
知っておくといい。残念ながら、これは全体のコンソールの色を変更し、問題は、単一の行(またはその一部)を変更する方法..です
ルーク

6
OPは、このコマンドに精通しており、問題は特定の行ではなくコンソール全体を変更することであると述べています。
Randall Flagg 2014年

5
はい、確かに本当の意味での反応はありませんが、それでも知っておくと役に立ちます。
CuriousMarc 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.