的Cmd.exe批处理脚本双色输出用FOR/F“MSYS”命令

问题描述:

我已经开始利用批处理脚本ANSI颜色代码为Windows 10今天,我发现突然颜色停止工作,而且我也被曝for命令使用嵌入式MSYS命令。例如:的Cmd.exe批处理脚本双色输出用FOR/F“MSYS”命令

@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有他们自己的巫术,但我想不出一个解释。是否在命令行持续时间内切换颜色解释?如果是的话,是否会有办法强制它恢复?

附加:

值得一提的是它似乎影响了整个“命令行”,如果你已经使用括号包裹在括号中的整个位似乎受到影响嵌套如果和维权的意义。

+0

http://*.com/questions/16755142/how-to-make-win32-console-recognize-ansi-vt100-escape-sequences 我不知道,ANSI颜色工作过在Windows 10 – abelenky

+0

我敢肯定,这是超级简陋,像FINDSTR声称事情是正则表达式。 – SomethingDark

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

示例代码

@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

正如所看到的,你可以处理一个简单的例子,但混帐sha1sum可执行文件干扰控制台。

一些替代

  • 最简单的一种是将输出发送到一个文件,然后使用for /f到文件

  • Here你有一种方式来处理问题的信息处理(您将需要编译的代码)

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

+0

谢谢。我认为这是我们无需直接从Microsoft获得反馈即可获得的最佳答案。在我的情况下,我把我的输出移出命令行来解决它。感谢您的建议。 C程序也很有吸引力。 –