[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

如何判断系统是不是支持使用 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

评分人数

直接判断系统可行不?或者放进for里findstr??

TOP

  1. for /f "tokens=4 delims=. " %%i in ('ver') do (
  2.     if %%i equ 10 (
  3.         ...
  4.     ) else (
  5.         ...
  6.     )
  7. )
复制代码

TOP

  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
复制代码

这样判断行吗
bat小白,请多指教!谢谢!

TOP

回复 4# 77七


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

评分人数

    • 77七: 感谢分享技术 + 1

TOP

回复 5# buyiyang


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


应该可以呀。
bat小白,请多指教!谢谢!

TOP

win10系统,试了将find "38" 的结果重定向到文本。分号变成空格了。
bat小白,请多指教!谢谢!

TOP

本帖最后由 hnfeng 于 2024-7-4 20:22 编辑
回复  77七


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



    是的是的,win10里面看上去都是 XXX,但是比较结果不一样,有一些转义符没显示出来
在win7里面和win10里面结果总是一样,判断结果总是同一个

TOP

在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
复制代码

TOP

回复 7# 77七


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

评分人数

    • 77七: 感谢分享技术 + 1

TOP

或许可以查询注册表看看  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. }
复制代码

TOP

回复 10# Five66


   
谢谢大佬指点!果然如此!
bat小白,请多指教!谢谢!

TOP

或许可以查询注册表看看  HKCU\CONSOLE 下有无 VirtualTerminalLevel 这个值

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



在win10里面,HKCU\CONSOLE 下有 VirtualTerminalLevel

在win7 和 win11 里面,HKCU\CONSOLE 下无 VirtualTerminalLevel   ,也不对哦,win11支持转义的

TOP

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 结束。

QQ 20147578

TOP

返回列表