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

时间:2017-04-04 17:09:21

标签: batch-file colors ansi msys

我已经开始在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的插入模式下输入<C-V><ESC>。)

在我的情况下,sha1sum.exe从Git for Windows引用C:\Program Files\Git\usr\bin\sha1sum.exe。我们都知道批处理脚本/ cmd.exe有关于它们的自己的魔法,但我想不出对此的解释。是否以某种方式在命令行的持续时间内关闭颜色解释?如果是这样,会有办法强制它重新开始吗?

APPEND:

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

1 个答案:

答案 0 :(得分: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

输出 sample code output

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

一些替代方案

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

  • Here您有处理问题的方法的信息(您需要编译代码)

  • 为作品选择不同的工具。