找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 14308|回复: 13

[其他] 批处理如何判断系统是不是支持使用 ANSI 转义序列?

[复制链接]
发表于 2024-7-4 09:05:55 | 显示全部楼层 |阅读模式
如何判断系统是不是支持使用 ANSI 转义序列(ANSI escape code) 来控制文本的颜色
(主要是想bat在新旧系统里面都能正常运行,在支持的系统里面使用彩色,在不支持的系统里面使用默认)

因为win10可以支持使用 ANSI 转义序列,在cmd/bat里面使用更多颜色,但是win7和以前的系统不支持,只能使用16色(8色加高亮)
那么除了用版本号来判断,有无其他更准更好的方法来判断当前系统是否支持更多颜色?

在win7的cmd里面,echo ^[[38;5;36;40mXXX 显示的是 ←[38;5;36;40mXXX
在win10的cmd里面,echo ^[[38;5;36;40mXXX 显示青色的 XXX

上面的 ^[ 是 Ctrl+[
在bat里面也可以使用 for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set EscK=%%i 来定义个变量

errorlevel  以及使用 for 来获取上面输出的部分字符,在win7和win10里面结果都是一样的,没有区别。还有什么方法呢

评分

参与人数 1技术 +1 收起 理由
老刘1号 + 1 感谢分享

查看全部评分

发表于 2024-7-4 09:59:45 | 显示全部楼层
直接判断系统可行不?或者放进for里findstr??
发表于 2024-7-4 10:32:49 | 显示全部楼层
  1. for /f "tokens=4 delims=. " %%i in ('ver') do (
  2.     if %%i equ 10 (
  3.         ...
  4.     ) else (
  5.         ...
  6.     )
  7. )
复制代码
发表于 2024-7-4 19:04:51 | 显示全部楼层
  1. @echo off
  2. for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set EscK=%%i
  3. for /f "delims=" %%a in ('echo %EscK%[38;5;36;40mXXX') do echo "%%a"|find "38;5;36;40m" && echo 1||echo 2
  4. pause
复制代码

这样判断行吗
发表于 2024-7-4 19:12:00 | 显示全部楼层
回复 4# 77七


    这样应该不行,输出的依然是控制字符,只是被终端解析执行后显示不同而已。

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2024-7-4 19:22:12 | 显示全部楼层
回复 5# buyiyang


   
谢谢大佬指点!我这里win10上find查找失败了,如果如楼主所说
在win7的cmd里面,echo ^[[38;5;36;40mXXX 显示的是 ←[38;5;36;40mXXX


应该可以呀。
发表于 2024-7-4 19:38:32 | 显示全部楼层
win10系统,试了将find "38" 的结果重定向到文本。分号变成空格了。
 楼主| 发表于 2024-7-4 20:15:00 | 显示全部楼层
本帖最后由 hnfeng 于 2024-7-4 20:22 编辑
回复  77七


    这样应该不行,输出的依然是控制字符,只是被终端解析执行后显示不同而已。
buyiyang 发表于 2024-7-4 19:12



    是的是的,win10里面看上去都是 XXX,但是比较结果不一样,有一些转义符没显示出来
在win7里面和win10里面结果总是一样,判断结果总是同一个
 楼主| 发表于 2024-7-4 20:24:50 | 显示全部楼层
在win7和win10里面判断结果总是一样的
  1. @echo off
  2. for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set EscK=%%i

  3. for /f "delims=" %%a in ('echo %EscK%[36;5;36;40mXXX') do (
  4. rem echo %%a
  5.   if "%%a" EQU "XXX" (
  6.     echo Win10
  7.     ) else (
  8.     echo Win7
  9.     )
  10. )
  11. pause
  12. exit /b
复制代码
发表于 2024-7-4 20:27:33 | 显示全部楼层
回复 7# 77七


    分号变空格是因为for中的echo的分号  被去掉了

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2024-7-4 20:39:10 | 显示全部楼层
或许可以查询注册表看看  HKCU\CONSOLE 下有无 VirtualTerminalLevel 这个值

还有官网抄了段C代码,不知行否 (建议用msvc和1803以上的sdk编译)
运行后返回值0表示支持,1不支持,其他值出错

  1. #include <stdio.h>
  2. #include <wchar.h>
  3. #include <windows.h>

  4. /*
  5. https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#output-sequences
  6. */

  7. int main()
  8. {
  9.     // Set output mode to handle virtual terminal sequences
  10.     HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  11.     if (hOut == INVALID_HANDLE_VALUE)
  12.     {
  13.         return 3;
  14.     }

  15.     DWORD dwMode = 0;
  16.     if (!GetConsoleMode(hOut, &dwMode))
  17.     {
  18.         return 2;
  19.     }

  20.     dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
  21.     if (!SetConsoleMode(hOut, dwMode))
  22.     {
  23.         return 1;
  24.     }

  25.     return 0;
  26. }
复制代码
发表于 2024-7-4 20:43:23 | 显示全部楼层
回复 10# Five66


   
谢谢大佬指点!果然如此!
 楼主| 发表于 2024-7-4 22:07:08 | 显示全部楼层
或许可以查询注册表看看  HKCU\CONSOLE 下有无 VirtualTerminalLevel 这个值

还有官网抄了段C代码,不知行 ...
Five66 发表于 2024-7-4 20:39



在win10里面,HKCU\CONSOLE 下有 VirtualTerminalLevel

在win7 和 win11 里面,HKCU\CONSOLE 下无 VirtualTerminalLevel   ,也不对哦,win11支持转义的
发表于 2024-7-4 22:43:36 | 显示全部楼层
ver | find "4.0" > nul && set TheOS=Windows 95
ver | find "4.10"> nul && set TheOS=Windows 98
ver | find "4.90"> nul && set TheOS=Windows me
ver | find "3.51"> nul && set TheOS=Windows NT35
ver | find "5.0" > nul && set TheOS=Windows 2000
ver | find "5.1" > nul && set TheOS=Windows XP
ver | find "5.2" > nul && set TheOS=Windows 2003
ver | find "6.0" > nul && set TheOS=Windows Vista
ver | find "6.1" > nul && set TheOS=Windows 7
ver | find "6.2" > nul && set TheOS=Windows 8
ver | find "6.3" > nul && set TheOS=Windows 8.1
ver | find "10.0.1"> nul && set TheOS=Windows 10
ver | find "10.0.2"> nul && set TheOS=Windows 11

Windows 11              版本 10.0.22000.194- 开始
Windows 10              版本 10.0.10240 开始,以内部版本10.0.19044 结束。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 22:20 , Processed in 0.023531 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表