使用 FOR /F 'MSYS' 命令的 Cmd.exe 批处理脚本颜色输出

Posted

技术标签:

【中文标题】使用 FOR /F \'MSYS\' 命令的 Cmd.exe 批处理脚本颜色输出【英文标题】:Cmd.exe Batch Script Color Output With FOR /F 'MSYS' Commands使用 FOR /F 'MSYS' 命令的 Cmd.exe 批处理脚本颜色输出 【发布时间】:2017-04-04 17:09:20 【问题描述】:

我已经开始在 Windows 10 的批处理脚本中使用 ANSI 颜色代码。今天我发现颜色突然停止工作,我追踪到带有嵌入式 MSYS 命令的 for 命令。例如:

@echo off
echo ^[[92mThis works.^[[0m
for %%f in (x) do @echo ^[[93mThis also works.^[[0m
for /l %%f in (1,1,1) do @echo ^[[94mThis too works.^[[0m
for /f "tokens=*" %%f in ('date /t') do @echo ^[[95mThis one works.^[[0m
for /f "tokens=*" %%f in ('sha1sum.exe ^< NUL') do @echo ^[[91mThis one DOES NOT work.^[[0m
echo ^[[92mThis works.^[[0m

(注意:你看到的 "^[" 必须是单个 ESC 字符,ASCII 27,而不是。例如,在 Vim 的插入模式下键入 &lt;C-V&gt;&lt;ESC&gt;。)

在我的例子中,sha1sum.exe 指的是来自 Git for Windows 的 C:\Program Files\Git\usr\bin\sha1sum.exe。我们都知道批处理脚本/cmd.exe 对它们有自己的魔力,但我想不出对此的解释。在命令行期间是否以某种方式关闭颜色解释?如果是这样,是否有办法强制它重新启动?

追加:

值得注意的是,它似乎会影响整个“命令行”,这意味着如果您使用括号嵌套了 ifs 和 fors,那么括号中的整个位似乎都会受到影响。

【问题讨论】:

***.com/questions/16755142/… 我不确定 ANSI 颜色是否曾在 Windows 10 中工作过。 我确信它是超级初级的,就像 findstr 声称的那个东西是正则表达式一样。 【参考方案1】:

这只是一个确认和一些解决方法

示例代码

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /f %%a in ('
        forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo 0x1B"
    ') do set "ESC=%%a"

    echo %ESC%[91mRed
    echo %ESC%[92mGreen
    echo %ESC%[0mNormal

    echo A simple base test 
    for /f "tokens=1,2" %%a in ('
        echo 0000000000000000000000000000000000000000 %~f0
    ') do echo(.... %ESC%[92m%%a %ESC%[91m%%b %ESC%[0m

    echo Git sha1sum
    for /f "tokens=1,2" %%a in ('
        E:\portable\bin\git\64\usr\bin\sha1sum.exe "%~f0" 
    ') do echo(.... %ESC%[92m%%a %ESC%[91m%%b %ESC%[0m

    echo Git sha1sum DELAYED
    for /f "tokens=1,2" %%a in ('
        E:\portable\bin\git\64\usr\bin\sha1sum.exe "%~f0" 
    ') do set "output=%ESC%[92m%%a %ESC%[91m%%b %ESC%[0m"
    echo(.... %output%

    echo GNUPG sha1sum  
    rem     ftp://ftp.gnupg.org/gcrypt/binary/sha1sum.exe 
    rem     https://lists.gnupg.org/pipermail/gnupg-announce/2004q4/000184.html
    for /f "tokens=1,2" %%a in ('
        E:\portable\bin\sha1sum.exe "%~f0"
    ') do echo(.... %ESC%[92m%%a %ESC%[91m%%b %ESC%[0m

    echo %ESC%[90mDone%ESC%[0m

输出

如您所见,您可以处理一个简单的案例,但是 git sha1sum 可执行文件会干扰控制台。

一些替代品

最简单的方法是将输出发送到文件,然后使用for /f 处理文件

Here你有解决问题的方法的信息(你需要编译代码)

为工作选择不同的工具。

【讨论】:

谢谢。我认为这是我们可以在没有直接从 Microsoft 反馈的情况下获得的最佳答案。就我而言,我将输出移到命令行之外来解决它。感谢您的建议。 C 程序也很诱人。

以上是关于使用 FOR /F 'MSYS' 命令的 Cmd.exe 批处理脚本颜色输出的主要内容,如果未能解决你的问题,请参考以下文章

CMD中for的用法详解命令扩展

CMD中for的用法详解命令扩展

cmd dir /b/s 加上日期

用BAT让CMD连续之行2个命令

工具Msys2使用配置

如何使用 make 命令(MSYS)来构建 DCMTK?