it-swarm-vi.com

Cách lặp lại với các màu khác nhau trong dòng lệnh Windows

Tôi biết rằng lệnh color bf đặt màu của toàn bộ cửa sổ dòng lệnh nhưng tôi muốn in một dòng bằng một màu khác.

150
rui

Tôi muốn in một dòng duy nhất bằng một màu khác.

Sử dụng chuỗi thoát ANSI.

Windows trước 10 - không hỗ trợ riêng cho màu ANSI trên bảng điều khiển

Đối với phiên bản Windows dưới 10, bảng điều khiển lệnh Windows không hỗ trợ tô màu đầu ra theo mặc định. Bạn có thể cài đặt Cmder , ConEmu , ANSICON hoặc Mintty (được sử dụng theo mặc định trong GitBash và Cygwin) để thêm hỗ trợ tô màu cho bảng điều khiển lệnh Windows của bạn.

Windows 10 - Màu dòng lệnh

Bắt đầu từ Windows 10, bảng điều khiển Windows hỗ trợ Trình tự thoát ANSI và một số màu theo mặc định. Tính năng được cung cấp cùng với Cập nhật Ngưỡng 2 vào tháng 11 năm 2015.

Tài liệu MSDN

Bản giới thiệu

 enter image description here

Lệnh hàng loạt

win10colors.cmd được viết bởi Michele 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
180
Jens A. Koch

Đây là một hỗn hợp bat/.net tự biên dịch (nên được lưu dưới dạng .BAT) có thể được sử dụng trên bất kỳ hệ thống nào đã cài đặt khung .net (rất hiếm khi thấy một cửa sổ không có .NET framework ngay cả đối với bản cài đặt XP/2003 cũ nhất). Nó sử dụng trình biên dịch jscript.net để tạo một exe có khả năng in các chuỗi với màu nền/nền trước khác nhau chỉ cho dòng hiện tại.

@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;

Đây là thông báo trợ giúp:

 enter image description here

Thí dụ:

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

Bạn cũng có thể tìm thấy tập lệnh này tại đây .

Bạn cũng có thể kiểm tra chức năng màu của carlos -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453

46
npocmaka

Đây không phải là một câu trả lời hay, nhưng nếu bạn biết máy trạm mục tiêu có Powershell, bạn có thể làm một cái gì đó như thế này (giả sử tập lệnh BAT/CMD):

CALL:ECHORED "Print me in red!"

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

Chỉnh sửa: (bây giờ đơn giản hơn!)

Đó là một câu trả lời cũ nhưng tôi đoán tôi sẽ làm rõ và đơn giản hóa một chút

img

PowerShell hiện là bao gồm trong tất cả các phiên bản của Windows kể từ 7. Do đó, cú pháp cho câu trả lời này có thể được rút ngắn thành một hình thức đơn giản hơn:

  • path không cần phải được chỉ định vì nó phải nằm trong biến môi trường.
  • Các lệnh không rõ ràng có thể là viết tắt . Ví dụ: bạn có thể:
    • sử dụng -fore thay vì -foregroundcolor
    • sử dụng -back thay vì -backgroundcolor
  • về cơ bản, lệnh cũng có thể được sử dụng 'inline' thay cho echo
    (Thay vì tạo một tệp bó riêng như trên).

Thí dụ:

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

Thêm thông tin:

Danh sách đầy đủ các màu sắc và nhiều thông tin có sẵn trong
- PowerShell Tài liệu cho Write-Host

34
Iain

Bạn chỉ có thể tạo các tệp có tên của Word để in, sử dụng findstr có thể in màu và sau đó xóa tệp. Hãy thử ví dụ này:

@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

Chạy color /? để có danh sách màu.

17
Tutankhamen

Bạn có thể sử dụng ANSICON để bật mã đầu cuối ANSI trong Windows hiện đại. Có các phiên bản 32 và 64 bit mà tôi đã sử dụng trong Windows XP và Windows 7.

13
Bryan Ash

Windows 10 - TH2 trở lên:

Tại Dấu nhắc lệnh:

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

Sử dụng các phím thực tế: echo Ctrl+[[32m HICtrl+[[0mEnter

Bạn sẽ thấy một chữ "HI" màu xanh lá cây bên dưới nó.

Mã số có thể được tìm thấy ở đây:

Sổ tay:

Để lưu phần này vào notepad, bạn có thể nhập ESC vào nó bằng cách sử dụng: Alt+027 với numpad, sau đó là phần [32m. Một mẹo khác khi tôi ở trên máy tính xách tay, chuyển hướng dòng trên thành tệp để bắt đầu, sau đó cắt và dán:

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

Tôi cảm thấy khó chịu vì thiếu màu sắc thích hợp trong cmd, vì vậy tôi đã tiếp tục và tạo cmdcolor. Đây chỉ là một proxy xuất sắc, tìm kiếm một bộ trình tự kiểm soát ANSI/VT100 giới hạn (nói cách khác, như trong bash), tức là echo \033[31m RED \033[0m DEFAULT | cmdcolor.exe.

Cách sử dụng và tải xuống .

6
Olegs Jeremejevs

Tôi đã xem xét điều này bởi vì tôi muốn giới thiệu một số màu văn bản đơn giản cho tệp Batch Win7. Đây là những gì tôi đã đưa ra. Cảm ơn bạn đã giúp đỡ.

@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

bạn có thể sử dụng cecho .. bạn cũng có thể sử dụng nó để nhúng ngay vào tập lệnh của mình để bạn không phải mang theo một tên miền hay .exe

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

1
Brian Gleason

Một cách khác là sử dụng NodeJS.

Đây là một ví dụ:

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

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

Và đây là kết quả:

 enter image description here

0
Josem

Bạn sẽ cần phải lặp lại một chuỗi mã thoát ANSI để thay đổi màu văn bản: http://en.wikipedia.org/wiki/ANSI_escape_code

Một nguồn rất tốt khác của các mã thoát này là http://ascii-table.com/ansi-escape- resultences.php

0
Bernhard Hofmann

Đặt các dòng sau vào một tệp có tên ColourText.bas trên máy tính để bàn của bạn.

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

Lưu nó và gõ như sau trong một lệnh Nhắc.

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

Một tệp có tên ColourText.exe sẽ xuất hiện trên màn hình của bạn. Di chuyển nó vào thư mục Windows .

Để sử dụng, bạn phải sử dụng hai mã ký tự để đặt màu, ví dụ: 01 không 1

ColourText ColourOfText ColourOfTextWhenFinished Text

EG Để đặt màu xanh trên nền trắng bằng cách không chuyển bất kỳ văn bản nào, sau đó màu đỏ trên văn bản màu trắng, kết thúc bằng màu xanh trên màu xám.

ColourText F1 F1
ColourText F2 71 This is green on white

hoặc là

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

Ngoài ra lệnh CLS trở nên thú vị. Lệnh Color không có tham số đặt lại tất cả các màu thành màu khởi động.

Để có được mã màu, thêm các số sau đây với nhau. Sử dụng Máy tính trong chế độ lập trình viên. Đây là những số hex. Chúng có thể được thêm vào với nhau, ví dụ Red + Blue + FG Intense = 13 = D. Vì 10+ không được sử dụng nên nền sẽ có màu đen. Mã màu PHẢI là hai ký tự, ví dụ 08 không 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

Để làm việc này trên Windows 10, bạn có thể bật cờ này: ENABLE_VIRTUAL_TERMINAL_PROCESSING.

Với khóa đăng ký này, bạn có thể đặt mặc định này

[HKCU\Console] VirtualTerminalLevel dword 0x1

0
Michel de Groot

Như Glenn Slayden đã nói trong câu trả lời này , bạn có thể thêm vào sổ đăng ký giá trị phù hợp để làm cho cmd "nhiều màu sắc hơn".

May mắn thay, mặc định toàn cầu có thể được thay đổi từ chọn tham gia sang từ chối. Khóa đăng ký tại HKEY_CURRENT_USER\Console\VirtualTerminalLevel đặt hành vi mặc định toàn cầu để xử lý các chuỗi thoát ANSI. Tạo khóa DWORD (nếu cần) và đặt giá trị của nó thành 1 thành bật toàn cầu (hoặc 0 để vô hiệu hóa `) xử lý ANSI theo mặc định.

0
hawk1337