我已经开始在 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 有它们自己的魔法,但我想不出对此的解释。它是否以某种方式在命令行期间关闭颜色解释?如果是这样,是否有办法强制重新启动它?
附录:
值得注意的是,它似乎会影响整个“命令行”,这意味着如果您使用括号嵌套了 ifs 和 fors,则括号中的整个位似乎都会受到影响。
这只是一个确认和一些解决方法
示例代码
@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
处理文件这里你有处理问题的方法的信息(你需要编译代码)
为工作选择不同的工具。