如何将批处理文件中的某一行与其他行的颜色区分开来?

17

我正在开发一个程序,用于为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行代码(但如果只有一种方法可以做好...)

我能否将红色的那一行与其余部分分别显示为绿色?或者应该让程序发出哔声以引起注意?您有更好、更简单的想法吗?我该如何做到这一点?


不能使用简单的标准批处理命令完成。需要编写一个复杂的脚本才能在单行上打印颜色,或者使用第三方工具来实现。微软的颜色命令只能更改整个屏幕的颜色。 - foxidrive
@foxidrive 我正在编写一个我将尝试销售的程序。它必须在任何PC上运行。你能否提供一个制作这样脚本的教程链接? - Sean McLain
4
仅仅因为某个解决方案允许一行上有多种颜色,并不意味着你必须使用多种颜色。链接的解决方案甚至解释了如何使用 ECHO( 来终止当前行以便下一行。 - dbenham
@dbenham 噢,它在代码段本身。有点令人困惑。谢谢老兄。 - Sean McLain
1
可能是如何在Windows批处理文件中使用多种颜色?的重复问题。 - phuclv
显示剩余5条评论
5个回答

35

昨天我也遇到了同样的问题,我进行了一些研究,这个方法对我有效。 编辑:这段代码与另一个不同。

@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
这样做的作用是: Output

你只需要把从SETLOCAL EnableDel)这一部分放在你的代码开头(如果你的代码以@echo off开始,则将其放在其下面),并将从:colorEchodel %~2这一部分放在脚本的确切底部(底部没有任何内容!

现在你会注意到之间的区别。

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!"): 这是一个带颜色的 echo 命令,它惊人地输出 This is colored green with a black background!,使用了 0a (黑底绿字)。 第二行 (echo.) 输出一个新行,因为我们的有色 echo 命令没有输出新行。

因此

假设你想要用黄色输出 "Hello",绿色输出 "World" 来打印出 "Hello World"。 例如!

call :colorEcho 0e "Hello" & call :colorEcho 0a " 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
这是它的功能: Output 我希望这能让人理解!
编辑:确保程序在达到:colorEcho之前退出。

感谢您对我的问题给出了详尽的答复 :3 这将对我撰写程序的许多不同领域有所帮助。现在我知道如何使用它来突出句子中的一个单词,例如。 - Sean McLain
2
整洁,但这可能会删除您磁盘上的文件。假设您想要显示文件名并突出显示它(即“c:\output\reports\test.txt”),则代码应为... call :colorEcho 0a "c:\output\reports\test.txt"在 :colorEcho 的最后一行... del "%~2" .... 如果该文件实际存在,则会将其删除。 - joshgo
2
在高亮行中使用特殊字符是否可行?例如,这个可以:call :colorEcho 0e "anthing I can help with"但是这个不行:call :colorEcho 0e "anthing else I can help with?" - Harry Cosslett
不确定最初是谁提出了这个想法,但有许多早于此帖子的帖子。非常好!小问题:您的帖子使用感叹号调用colorEcho,但该标记未输出(还有两个问题:无法使用单个点“。”,或者如果文件已经存在,则结果会很糟糕,但这很容易解决)。 - Abel
2
对于每个试图使用程序绘制一些花哨的人,你需要避免使用像 :/\ 这样的字符,这些会让你的字符串看起来像一个路径(这也适用于 ...),同时还要避免使用通配符 *。请注意,你不能使用尾部空格。祝你绘画愉快 ;) - Skandix
显示剩余4条评论

2

以下是来自此处的脚本:如何在Windows批处理文件中使用多种颜色?,稍作修改(简化):

@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


好的,这段代码应该放在批处理文件的开头。但是,我如何让它在文件中的许多不同位置工作,而不仅仅是一个位置?我需要知道如何使用代码以及代码是什么。我只是半文盲的批处理用户。 - Sean McLain
@SeanMcLain:第一行(for命令)只是生成一个变量,你只需要执行一次。从:ColorText开始到goto :eof结束的代码是一个“子程序”。你也只需要执行一次。你可以在需要的地方和需要的次数调用它。 - Stephan
啊,谢谢!那么如果我想要除了“基本”颜色之外有多种可用的颜色,比如青色,我需要为每种颜色添加一个副本,将0a更改为0c以及其他颜色?另外,:eof在哪里?我找不到这个标签,如果我按原样运行代码,它会破坏我的代码,我需要将标签更改为程序开头的标签吗?我试过了,我必须将其更改为“goto:menu”,否则它根本无法运行。在调用命令的实例中,我收到有关其为无效命令的错误消息 :/ - Sean McLain
不需要修改代码,只需更改参数即可:call :ColorText 0c "红色文本" 或 `call :ColorText 0a "绿色文本"。' 我已经编辑了我的回答以向您展示。 - Stephan
这个根本不起作用...或者至少我这样做不行 :/ 它要么无法运行,要么会显示一个错误消息,而不是红色的文本,然后屏幕上应该显示的其余文本。 - Sean McLain
@Sean:也许你应该将上面的例子复制粘贴到一个单独的批处理文件中运行一下。你会发现它是可以正常工作的,所以你正在进行的修改可能是导致问题出现的原因。关于“:eof”,这是一个内置标签,表示文件末尾,也是一个子程序最重要的部分。请不要改动它。 - indiv

0
@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\

0
你可以尝试这个脚本。使用它来在任何屏幕位置打印任何颜色的文本。它不使用临时文件,但你的系统必须有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

0

老派技巧:

echo =======================================================================================================================
echo [37m[0;1;36m*************************************************************************
echo    *****   *****   *****   [31mWiindows 10 Networking  [36m*****   *****   *****
echo *************************************************************************[37m[0;1;37m
echo echo [37m[0;1;32m
echo =======================================================================================================================

剪切和粘贴 - 我从来找不到关于这种编码的文档[?]在DOS中曾经是一个向前的箭头,在我的Autoexec.bat文件中很有趣。希望对一些黑客有所帮助 - 他们确实帮了我,谢谢!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接