So che il color bf
comando imposta i colori dell'intera finestra della riga di comando ma volevo stampare una singola riga in un colore diverso.
So che il color bf
comando imposta i colori dell'intera finestra della riga di comando ma volevo stampare una singola riga in un colore diverso.
Risposte:
Volevo stampare una sola riga in un colore diverso.
Usa sequenze di escape ANSI.
Windows prima delle 10 - nessun supporto nativo per i colori ANSI sulla console
Per la versione di Windows inferiore a 10, la console di comando di Windows non supporta la colorazione dell'output per impostazione predefinita. È possibile installare Cmder , ConEmu , ANSICON o Mintty (utilizzati per impostazione predefinita in GitBash e Cygwin) per aggiungere il supporto per la colorazione alla console dei comandi di Windows.
Windows 10 - Colori della riga di comando
A partire da Windows 10 la console di Windows supporta le sequenze di escape ANSI e alcuni colori per impostazione predefinita. La funzionalità è stata fornita con l'aggiornamento Soglia 2 nel novembre 2015.
Aggiornamento (05-2019): ColorTool consente di modificare la combinazione di colori della console. Fa parte del progetto Microsoft Terminal .
dimostrazione
Comando batch
Il è win10colors.cmd
stato scritto da 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
.cmd
oppure .bat
- entrambi dovrebbero funzionare. Ma penso di sapere perché non funziona: sembra che il simbolo di escape venga rimosso quando si pubblica su StackOverflow. Per favore, non copiare il contenuto dalla mia risposta, usa invece il contenuto di qui: gist.githubusercontent.com/mlocati/…
ESC
in notepad ++ prima ... Puoi farlo con i codici ALT usando il tastierino numerico e il tasto ALT sinistro: L-ALT
+ 0
+ 2
+7
ESC
personaggio in un file Batch in questo modo:for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Questo è un ibrido bat / .net autocompilato (dovrebbe essere salvato come .BAT
) che può essere usato su qualsiasi sistema che abbia installato un framework .net (è raro vedere un windows senza .NET framework anche per il più vecchio XP / 2003 installazioni). Utilizza il compilatore jscript.net per creare un exe in grado di stampare stringhe con colori di sfondo / primo piano diversi solo per la riga corrente.
@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;
Ecco il messaggio di aiuto:
Esempio :
coloroutput.bat -s "aa\nbb\n\u0025cc" -b 10 -f 3 -n -e
Puoi anche trovare questo script qui .
Puoi anche controllare la funzione colore di Carlos -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453
Questa non è un'ottima risposta, ma se sai che la workstation di destinazione ha Powershell puoi fare qualcosa del genere (supponendo uno script BAT / CMD):
CALL:ECHORED "Print me in red!"
:ECHORED
%Windir%\System32\WindowsPowerShell\v1.0\Powershell.exe write-host -foregroundcolor Red %1
goto:eof
È una vecchia risposta, ma ho pensato di chiarire e semplificare un po '
PowerShell è ora incluso in tutte le versioni di Windows dal 7. Pertanto la sintassi per questa risposta può essere abbreviata in una forma più semplice:
-fore
invece di-foregroundcolor
-back
invece di-backgroundcolor
echo
powershell write-host -fore Cyan This is Cyan text
powershell write-host -back Red This is Red background
L'elenco completo dei colori e ulteriori informazioni sono disponibili nella documentazione di
- PowerShell perWrite-Host
Windows 10 - TH2 e versioni successive:
(aka versione 1511, build 10586, versione 2015-11-10)
Al prompt dei comandi:
echo ^[[32m HI ^[[0m
Usando i tasti attuali: echo Ctrl+ [[32m HI
Ctrl+[[0m
Enter
Dovresti vedere un "HI" verde sotto di esso.
I numeri di codice sono disponibili qui:
Bloc notes:
Per salvarlo nel blocco note, è possibile digitare ESC in esso usando: Alt+ 027
con il tastierino numerico, quindi la [32m
parte. Un altro trucco quando ero su un laptop, reindirizza la riga sopra in un file per iniziare, quindi taglia e incolla:
echo echo ^[[32m HI ^[[0m >> batch_file.cmd
\033
ma no ... come potrei farlo in Java?
Puoi semplicemente creare file con il nome della parola da stampare, utilizzare findstr che può stampare a colori e quindi cancellare il file. Prova questo esempio:
@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
Esegui color /?
per ottenere un elenco di colori.
È possibile utilizzare ANSICON per abilitare i codici terminali ANSI nelle versioni precedenti di Windows. Esistono versioni a 32 e 64 bit che ho usato in Windows XP e Windows 7.
Sono stato infastidito dalla mancanza di una corretta colorazione anche in cmd, quindi sono andato avanti e ho creato cmdcolor . È solo un proxy stdout, che cerca una serie limitata di sequenze di controllo ANSI / VT100 (in altre parole, come in bash), vale a dire echo \033[31m RED \033[0m DEFAULT | cmdcolor.exe
.
cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
upx
. Potresti contattarmi via e-mail, per favore?
Ho osservato questo perché volevo introdurre alcuni semplici colori di testo in un file batch di Win7. Questo è quello che mi è venuto in mente. Grazie per l'aiuto.
@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
C'è una risposta accettata con oltre 250 voti già. Il motivo per cui sto ancora contribuendo è che ilescape
carattere richiesto per l'eco non è accettato da molti editor (sto usando, ad esempio, il codice MS) e tutte le altre soluzioni richiedono alcuni software di terze parti (non di default di Windows).
Al PROMPT
posto di usare la soluzione alternativa con l'utilizzo di semplici comandi batch ECHO
. Il PROMPT
comando accetta il escape
personaggio in modo intuitivo con qualsiasi editor come $E
sequenza di caratteri. (Sostituisci semplicemente Esc
nei codici di escape ASCII ) con $E
.
Ecco un codice demo:
@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
NOTA: L'unico inconveniente è che questa tecnica si scontra con le impostazioni di colore cmd dell'utente (color
comando o impostazioni) se non conosciute in modo esplicito.
- Spero che questo mi aiuti, poiché questa è l'unica soluzione accettabile per me per i motivi menzionati all'inizio. -
MODIFICARE:
Sulla base dei commenti, allego un altro frammento ispirato a @Jeb. It:
ECHO
comandi "nativi"PROMPT
valore localeECHO
dell'output influisce inevitabilmente sul PROMPT
colore, quindi il colore deve essere ripristinato, comunque@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
for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
echo
usato in batcolors / echo.bat "?
set ASCII27=←
con for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E"
. Questo utilizza il carattere di escape creato dal comando prompt, senza modificare il prompt in modo permanente (poiché il prompt
comando viene eseguito in un processo figlio). Btw. Il tuo echos.bat
ha un potenziale di ottimizzazione ...
Sto aggiungendo una risposta per risolvere un problema riscontrato in alcuni commenti sopra: che i codici colore ansi in linea possono comportarsi in modo errato quando si trovano all'interno di un ciclo FOR (in realtà, all'interno di qualsiasi blocco di codice tra parentesi). Il codice .bat seguente mostra (1) l'uso di codici colore in linea, (2) il fallimento del colore che può verificarsi quando i codici colore in linea vengono utilizzati in un ciclo FOR o all'interno di un blocco di codice tra parentesi e (3) una soluzione a il problema. Quando viene eseguito il codice .bat, i test 2 e 3 dimostrano l'errore del codice colore e il test 4 non mostra alcun errore poiché implementa la soluzione.
[EDIT 2020-04-07: ho trovato un'altra soluzione che è presumibilmente più efficiente rispetto alla chiamata di una subroutine. Racchiudere la frase FINDSTR tra parentesi, come nella seguente riga:
echo success | (findstr /R success)
EndEdit]
Nota: nella mia (limitata) esperienza, il problema del codice colore si manifesta solo dopo che l'input è stato reindirizzato a FINDSTR all'interno del blocco di codice. Ecco come il seguente .bat riproduce il problema. È possibile che il problema con il codice colore sia più generale che dopo il piping su FINDSTR. Se qualcuno può spiegare la natura del problema e se esiste un modo migliore per risolverlo, lo apprezzerei.
@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
potresti usare cecho .. puoi anche usarlo per incorporarlo direttamente nel tuo script in modo da non dover portare con te un .com o .exe
http://www.codeproject.com/Articles/17033/Add-Colors-to-Batch-Files
Ho appena convertito da Win 7 Home a Win 10 Pro e volevo sostituire il batch che chiamo da altri batch per riecheggiare le informazioni a colori. Rivedendo quanto discusso sopra, utilizzo quanto segue che sostituirà direttamente il mio batch precedente. NOTA l'aggiunta di "~" al messaggio in modo da poter utilizzare i messaggi con spazi. Invece di ricordare i codici, uso le lettere per i colori di cui avevo bisogno.
Se% 2 contiene spazi richiede "..."% 1 Colori forti sul nero: R = Rosso G = VERDE Y = GIALLO W = BIANCO
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
Devi modificare l'eco di una sequenza di codici di escape ANSI per modificare il colore del testo: http://en.wikipedia.org/wiki/ANSI_escape_code
Un'altra ottima fonte di questi codici di escape è http://ascii-table.com/ansi-escape-sequences.php
Inserisci le seguenti righe in un file chiamato ColourText.bas
sul desktop.
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
Salvalo e digita quanto segue in un prompt dei comandi.
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /target:exe /out:"%userprofile%\desktop\ColourText.exe" "%userprofile%\desktop\ColourText.bas" /verbose
Un file chiamato ColourText.exe apparirà sul desktop. Spostalo nella cartella Windows .
Per utilizzare è necessario utilizzare due codici di caratteri per impostare il colore, ad esempio 01
no 1
.
ColourText ColourOfText ColourOfTextWhenFinished Text
Ad esempio, per impostare il blu su bianco non passando alcun testo, quindi il rosso su testo bianco, finendo con il blu sul grigio.
ColourText F1 F1
ColourText F2 71 This is green on white
o
ColourText F1 F1
cls
ColourText F4 F4
Echo Hello
Echo Hello today
ColourText F1 F1
Anche il CLS
comando diventa interessante.Color
il comando senza parametri reimposta tutti i colori sui colori di avvio.
Per ottenere il codice colore, sommare i seguenti numeri. Utilizzare la calcolatrice in modalità programmatori. Questi sono numeri esadecimali. Possono essere aggiunti insieme, ad esempio Rosso + Blu + Intensità FG = 13 = D. Poiché non sono stati utilizzati 10+, lo sfondo sarà nero. Codici colore deve essere due personaggi, per esempio 08
non 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.
Per ottenere questo lavoro su Windows 10, è possibile attivare questo flag: ENABLE_VIRTUAL_TERMINAL_PROCESSING
.
Con questa chiave di registro puoi impostarla per impostazione predefinita
[HKCU\Console] VirtualTerminalLevel dword 0x1
Come ha affermato Glenn Slayden in questa risposta , è possibile aggiungere al registro il valore corretto per rendere il cmd "più colorato".
Fortunatamente, il default globale può essere modificato da opt-in a opt-out. La chiave del Registro di sistema in HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel imposta il comportamento predefinito globale per l'elaborazione delle sequenze di escape ANSI. Creare una chiave DWORD (se necessario) e impostarne il valore su 1 per abilitare globalmente (o 0 per disabilitare`) l'elaborazione ANSI per impostazione predefinita.
L'impostazione del colore per le dichiarazioni del registro in PowerShell non è un grande amico.
puoi usare il -ForegroundColor
parametro.
Per scrivere un messaggio di conferma.
Write-Host "Process executed Successfully...." -ForegroundColor Magenta
Per scrivere un messaggio di errore.
Write-Host "Sorry an unexpected error occurred.." -ForegroundColor Red
Per scrivere un messaggio di avanzamento .
Write-Host "Working under pocess..." -ForegroundColor Green
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%
è vuoto, quindi non funzionerà. echo !white!
imposta il colore su bianco. Per tornare ai colori predefiniti (indipendentemente dalle impostazioni dell'utente): il color
comando senza parametri lo fa.
Lo facevamo con i codici terminali ANSI . Non sono sicuro che funzionino ancora, ma potresti provarli.
È possibile utilizzare il comando color per modificare il colore dell'intera console
Color 0F
È in bianco e nero
Color 0A
È nero e verde