命令提示符脚本:批处理文件中存在多种颜色

时间:2019-02-12 19:17:12

标签: batch-file cmd

我知道我的问题已经有了答案,但是我很愚蠢,不知道如何更改这些答案中的代码以适应我的需求,所以请不要报告此问题,而应该帮我这个问题。

示例代码:

@echo off
color 0a
echo #######################################
echo ##                                   ##
echo ##     ########################      ##
echo ##     ## Password Protected ##      ##
echo ##     ########################      ##
echo ##                                   ##
echo #######################################
choice /c:ws /n /m "thisisjustrandomtext" 
if %ERRORLEVEL% == 1 goto testpart1
if %ERRORLEVEL% == 2 goto testpart2

:testpart1
echo thisispart1
pause >NUL
exit

:testpart2
echo thisispart2
pause >NUL
exit

我如何区分“密码保护”标志IE:

########################
##                    ##
########################

为红色,但让其他所有颜色为绿色。

2 个答案:

答案 0 :(得分:1)

这是我修改过的东西,没什么花哨的,只是向您展示可以做什么。原始内容来自Jeb的回答,尽管它确实很旧,但可以进行很多更改以改善它,但是根据我在这里的时间,我现在就给你我能做的:

@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 "clr=%%a"
)

echo/
call :change 4 #########################
echo/
call :change 4 "#     #"
call :change 2A "Some String"
call :change 4 "#     #"
echo/
call :change 4 #########################

goto :eof

:change
echo off
<nul set /p ".=%clr%" > "%~2"
findstr /v /a:%1 /r "^$" "%~2" nul
del "%~2" > nul 2>&1

答案 1 :(得分:1)

制作自己的程序以执行所需的操作。

与链接的重复页面上的13个愚蠢的答案不同。这将是盲目的快速。 CMD.exe打开一个批处理文件,读取1行,然后关闭该文件。每行重复一次。更糟糕的使用变量意味着每次都需要重新利用环境块。

@ColourText f2 F2 *********************************
@ColourText F4 F2 Warning
@Echo ***************************************

REM ColourText.bat
REM Compiles ColourText.vb to ColourText.exe
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /target:exe /out:"%~dp0\ColourText.exe" "%~dp0\ColourText.vb" /verbose
pause

'ColourText.vb
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

要使用

ColourText <ColourOfText> <ColourOfTextWhenFinished> [Text]

CLS命令也变得有趣。不带参数的Color命令会将所有颜色重置为启动颜色。

要获得颜色代码,请将以下数字加在一起。在程序员模式下使用计算器。这些是十六进制数字。可以将它们加在一起,例如红色+蓝色+ FG强度= 13 =D。由于未使用10+,因此背景将是黑色。颜色代码必须是两个字符,例如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,而白色为F0(相加10 + 20 + 40 + 80)。白底红字是f4。

编辑

这将打印<GREEN>*<RED>Warning<GREEN>*

使用正确的工具进行工作。

'ColourText1.vb
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 IntPtr
    Dim Ret as Integer
    hOut  = GetStdHandle(STD_OUTPUT_HANDLE)
    Ret = SetConsoleTextAttribute(hOut,  &hfA)
    Console.Out.Write("*")
    Ret = SetConsoleTextAttribute(hOut, &hfC)
    Console.Out.Write("Warning")
    Ret = SetConsoleTextAttribute(hOut, &hfA)
    Console.Out.Write("*" & vbcrlf)
End Sub
End Module