【问题标题】:Command Prompt Scripting: Problem with multiple colors in a batch file [duplicate]命令提示符脚本:批处理文件中存在多种颜色的问题[重复]
【发布时间】:2019-02-12 19:17:12
【问题描述】:

我知道我的问题已经有了答案,但是我很笨,不知道如何更改这些答案中的代码以满足我的需要,所以请不要报告这个问题,而是帮助我遇到这个问题。

示例代码:

@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的情况:

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

是红色的,但其他一切都是绿色的。

【问题讨论】:

  • 可以做到但并不容易,如果我要发布 n 答案而你删除了我的时间会得到什么?很遗憾,这里不支持免费代码请求
  • 编辑了问题,抱歉。
  • 这适用于哪个操作系统?不,我们不会设计和制作模板来阻止您将来学习、理解或尝试为自己创建更多脚本。请使用您找到的其他答案,并尽最大努力寻求解决方案,或者干脆忘记它,因为毕竟没有必要在 cmd.exe 中制作多色文本
  • 基本颜色功能作为答案发布在下面。但如果你需要更多的东西来处理特殊字符,我建议你在DosTips.com使用这个@
  • this question。如果它对您没有帮助,请查看那里的链接问题以获取更多信息。

标签: batch-file cmd


【解决方案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 命令也变得有趣。不带参数的颜色命令将所有颜色重置为启动颜色。

要获得颜色代码,请将以下数字加在一起。在程序员模式下使用计算器。这些是十六进制数字。它们可以加在一起,例如 Red + Blue + FG Intensity = 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。

编辑

这打印&lt;GREEN&gt;*&lt;RED&gt;Warning&lt;GREEN&gt;*

为工作使用正确的工具。

'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

【讨论】:

    【解决方案2】:

    这是我稍微修改了一下,没什么花哨的,只是向您展示可以做什么。原文来自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
    

    【讨论】:

    • 第一个问题:我是否应该将我的代码放在中间,即 echo 和 call 命令所在的位置?第二个问题:我从来没有见过echo/,和echo一样吗?还是别的什么?
    • 这是一个例子。在调用之前或之后再做一次回显,然后运行一些命令进行测试,这是您将学习的最简单的方法。 :)
    • @k9-primetime,您应该能够通过运行代码并查看输出来判断代码中的哪些行是正在输出的内容。
    • 这就是我现在想做的事情
    • 好的。这样做,测试,然后尝试通过显示代码、结果和预期结果来询问你是否卡住了。
    猜你喜欢
    • 2015-09-12
    • 2017-07-25
    • 2014-06-16
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多