【问题标题】:How do I make one particular line of a batch file a different color then the others?如何使批处理文件的一个特定行的颜色与其他行不同?
【发布时间】:2014-02-09 14:26:25
【问题描述】:

我正在开发一个为 D&D 游戏生成当天天气的程序。我希望程序在产生风暴时以红色文本显示警告,以便 DM 知道这种天气不典型。为了减少击键次数,它必须在与详细描述天气本身的文本相同的屏幕上执行此操作。

目前对于风暴的条目,我有这个:

:des4a
cls
type c:\AutoDM\WeatherGen\data\forcast1.txt
color 0c
echo     There is an Ashstorm!
color 0a
echo.
echo     It is %temp% degrees and the sky is invisible threw the thick 
echo     billowing clouds of ash.
echo.
echo         # Survival checks to light a fire are at +15. 
echo         # Small unprotected flames will be snuffed out.
echo         # Non-firearm ranged attacks are at a -8 to hit.
echo         # Preception checks take a -10 for every 10 feet of distance.
echo         # Survival checks to get along in the wild are at +15.
echo         # Stealth checks are at a +5.
echo.
echo     SPECIAL!
echo.
set /a die=6
set /a inches=%random%%%die+1
echo         # The ashstorm will deposit %inches% inches of ash durring its
echo           durration.
echo         # Tracking a target after an ashstorm is at a +15.
type c:\AutoDM\WeatherGen\data\forcast2.txt
echo.
echo.
pause
goto menu

类型命令调用文本文档,其中包含每个条目的页眉和页脚,以帮助程序看起来更专业,并提供边框以帮助自动换行。你不能被删除。请不要提出使我无法使用当前存在的类型命令的建议。请理解,这个红色文本行将添加到程序的许多不同部分,每次生成器中的每个生物群落都会产生风暴。我希望它不超过 2 或 3 行代码(但如果只有一种方法可以做得很好......)

我可以将一条线用红色,其余的线用绿色吗?或者我应该让程序发出哔哔声来提醒人们注意这个事实吗?你有更好更简单的想法吗?我该怎么做?

【问题讨论】:

  • @Stephan 不。那是在同一行中不止一种颜色。我需要屏幕上的一条线一种颜色,另一种颜色。该答案并没有解释如何很好地实现代码。每次您需要使用一种以上的颜色时,所有这些都会被放下吗?是否在开头放置一次然后使用命令词?它只是对我来说解释得不够好。
  • 不能用简单的标准批处理命令来完成。涉及的脚本可以在一行上打印颜色,或者第三方工具可以做到这一点。 Microsoft 颜色命令只会改变整个屏幕。
  • @SeanMcLain - 嗯,仅仅因为解决方案允许在一行上使用多种颜色并不意味着您必须有多种颜色。链接的解决方案甚至解释了如何使用ECHO( 来终止线路以准备下一条。

标签: batch-file


【解决方案1】:

我昨天遇到了同样的问题,我做了一些研究,对我有用。 编辑:这是与另一个相同的代码。

@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 :colorEcho 0a "This is colored green with a black background!"
echo.
call :colorEcho a0 "This is colored black with a green background!"
echo.
pause
exit
:colorEcho
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1i

它这样做:

您需要做的就是将 SETLOCAL EnableDel... 到 ) 的部分放在代码的开头(如果您的代码以 @echo 开头,则将其放在其下方)并放入从:colorEchodel %~2 的部分位于脚本的最底部(NOTHING UNDERNEATH!

现在你注意到了

call :colorEcho 0a "This is colored green with a black background!"
echo.
call :colorEcho a0 "This is colored black with a green background!"
echo.
pause
exit

逐行解释: 第一行 (call :colorEcho 0a "This is colored green with a black background!"):这是一个 colored 回声,令人惊讶的是,0a 中的 This is colored green with a black background!(黑色背景,绿色文本) 第二行 (echo.) 打印一个换行符,因为我们的彩色回显不打印一个。

所以

假设您想说“Hello World”,Hello 为黄色,World 为绿色。 例子!

@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 :colorEcho 0e "Hello "
call :colorEcho 0a " World"
pause
exit
:colorEcho
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1i

这就是它的作用: 我希望这是可以理解的!

编辑:确保程序 exits 可以到达 :colorEcho

【讨论】:

  • 感谢您对我的问题的全面回答:3 这将对我正在尝试编写的程序的许多不同领域有所帮助。现在我知道如何使用它来突出句子中的一个单词。
  • 很好,但这会删除磁盘上的文件。假设您想显示一个文件名并突出显示它(即“c:\output\reports\test.txt”),代码将是... call :colorEcho 0a "c:\output\reports\test.txt" :colorEcho ... del "%~2" .... 的最后一行将删除该文件,如果它确实存在。
  • 从我在 SO 上看到的所有数学中,你最容易理解和简短。 TY
  • 是否可以在突出显示的行中有特殊字符?例如这有效:call :colorEcho 0e "anthing I can help with" 但这不起作用:call :colorEcho 0e "anthing else I can help with?"
  • 适合所有想用它来画一些花哨的东西的人。您需要避免使用像:/\ 这样的字符,这些字符会让您的字符串看起来像一条路径(这也指的是...),并且还要避免使用像* 这样的通配符。请注意,您不能使用尾随空格。快乐的画;)
【解决方案2】:
@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 :colorEcho 0c "HyperBeast"
echo.
call :colorEcho 0c "NeonRider"
echo.
call :colorEcho 0d "Djinn"
echo.
call :colorEcho 0d "Eco"
echo.
call :colorEcho 0d "MonkeyBuisness"
echo.
call :colorEcho 05 "GrandPrix"
echo.
call :colorEcho 05 "PolePosition"
echo.
call :colorEcho 05 "Heat"
echo.
call :colorEcho 05 "WormGod"
echo.
call :colorEcho 09 "Origami"
echo.
call :colorEcho 09 "Man'o'war"
echo.
call :colorEcho 09 "Valence"
echo.
call :colorEcho 09 "BronzeDeco"
echo.
call :colorEcho 09 "ArmorCore"
echo.
call :colorEcho 09 "EliteBuild"
echo.
pause
exit
:colorEcho
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1\

【讨论】:

    【解决方案3】:

    你可以试试这个脚本。使用它在任何屏幕位置打印任何颜色的任何文本。它不使用临时文件,但您的系统必须有 debug.exe 可执行文件(Windows 原生):

    @echo off
    rem Script written by BrendanSilva [bl8086]
    rem You need DEBUG.EXE executable in your system.
    setlocal enabledelayedexpansion
    set /a _er=0
    set /a _n=0
    set _ln=%~4
    goto init
    :howuse ------------------------------------------------------------------------
        echo.
        echo ECOL.BAT - v2.0
        echo Print colored text as batch script without temporary files.
        echo Written by bl8086
        echo.
        echo Syntax:
        echo ECOL.BAT [COLOR] [X] [Y] "Insert your text here"
        echo COLOR value must be a hexadecimal number like "color /?" information
        echo.
        echo Example:
        echo ECOL.BAT F0 20 30 "640K ought to be enough for anybody."
        echo.
        goto :eof
    :error ------------------------------------------------------------------------
        set /a "_er=_er | (%~1)"
        goto :eof
    :gcnvhx ------------------------------------------------------------------------
        set _cvhx=
        set /a _cvint=%~1
    :cnvhx
        set /a "_gch = _cvint & 0xF"
        set _cvhx=!nsys:~%_gch%,1!%_cvhx%
        set /a "_cvint = _cvint >> 4"
        if !_cvint! neq 0 goto cnvhx
        goto :eof
    :init --------------------------------------------------------------------------
        if "%~4"=="" call :error 0xff
        (
            set /a _cl=0x%1
            call :error !errorlevel!
            set _cl=%1
            call :error "0x!_cl! ^>^> 8"
            set /a _px=%2
            call :error !errorlevel!
            set /a _py=%3
            call :error !errorlevel!
        ) 2>nul 1>&2
        if !_er! neq 0 (
            echo.
            echo ERROR: value exception "!_er!" occurred. Check memory out.
            echo.
            goto howuse
        )
        set nsys=0123456789ABCDEF
        set /a cnb=0
        set /a cnl=0
        set _cvhx=0
        set _cvint=0
        set _cvmhx=0
    :parse -------------------------------------------------------------------------
        set _ch=!_ln:~%_n%,1!
        if "%_ch%"=="" goto perform
        set /a "cnb += 1"
        if %cnb% gtr 7 (
            set /a cnb=0
            set /a "cnl += 1"
        )
        set bln%cnl%=!bln%cnl%! "!_ch!" %_cl%
        set /a "_n += 1"
        goto parse
    :perform -----------------------------------------------------------------------
        set /a "in = ((_py * 0xA0) + (_px << 1)) & 0xFFFF"
        call :gcnvhx %in%
        set ntr=!_cvhx!
        set /a jmp=0xe
        set bl8086str=echo.h 0 0
        @for /l %%x in (0,1,%cnl%) do (
            set bl8086str=!bl8086str!^&echo.eb800:!ntr! !bln%%x!
            set /a "in=!jmp! + 0x!ntr!"
            call :gcnvhx !in!
            set ntr=!_cvhx!
            set /a jmp=0x10
        )
        (
        echo %bl8086str%
        echo.q
        ) |debug >nul 2>&1
    

    【讨论】:

      【解决方案4】:

      这里的脚本: How to have multiple colors in a Windows batch file? 稍作修改(简化):

      @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"
      )
      echo next line in another color:
      call :ColorText 0c "There is an Ashstorm!"
      echo this was red.
      call :ColorText 0a "you survived it."
      
      goto :eof
      
      :ColorText
      echo off
      echo %DEL% > "%~2"
      findstr /v /a:%1 /R "^$" "%~2" nul
      del "%~2" > nul 2>&1
      goto :eof
      

      这是“可能重复:How to change the text color of comments line in a batch file”的第一个答案中的链接 "

      【讨论】:

      • 好的,这在批处理文件的开头。好的。但是如何让它在文件中的许多不同位置工作,而不仅仅是一个?我需要知道如何使用代码以及代码是什么。我只是半文盲。
      • @SeanMcLain:第一行(forcommand)只生成一个变量,您只需执行一次。以:ColorText 开头并以goto :eof 结尾的代码是一个“子程序”。您也只需要一次。您可以随时随地call它。
      • 啊,谢谢!因此,如果我想使用除“基础”颜色以外的多种颜色,比如青色,我会为每种颜色添加一个副本,将青色的 0a 更改为 0c 等等?还有 :eof 在哪里?如果我按正确方式运行它,我找不到该标签并且它会破坏我的代码?我是否在程序开始时将标签更改为一个?试过了,我必须让它“转到:菜单”,否则它根本不会运行。在调用命令所在的实例中,我收到一条错误消息,说明它是无效命令:/
      • 没有。只需更改参数:call :ColorText 0c "red Text" 或 `call :ColorText 0a "green text"' 我编辑了我的答案给你看。
      • 是的,这个讲解员完全可以工作......或者至少不是我这样做的方式:/它不会运行或将显示错误消息,而不是红色文本,然后是其余的文本应该在屏幕上。
      猜你喜欢
      • 2020-06-01
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 2014-07-31
      相关资源
      最近更新 更多