标题: [其他] 批处理如何判断系统是不是支持使用 ANSI 转义序列? [打印本页]
作者: hnfeng 时间: 2024-7-4 09:05 标题: 批处理如何判断系统是不是支持使用 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里面结果都是一样的,没有区别。还有什么方法呢
作者: Five66 时间: 2024-7-4 09:59
直接判断系统可行不?或者放进for里findstr??
作者: qixiaobin0715 时间: 2024-7-4 10:32
- for /f "tokens=4 delims=. " %%i in ('ver') do (
- if %%i equ 10 (
- ...
- ) else (
- ...
- )
- )
复制代码
作者: 77七 时间: 2024-7-4 19:04
- @echo off
- for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set EscK=%%i
- for /f "delims=" %%a in ('echo %EscK%[38;5;36;40mXXX') do echo "%%a"|find "38;5;36;40m" && echo 1||echo 2
- pause
复制代码
这样判断行吗
作者: buyiyang 时间: 2024-7-4 19:12
回复 4# 77七
这样应该不行,输出的依然是控制字符,只是被终端解析执行后显示不同而已。
作者: 77七 时间: 2024-7-4 19:22
回复 5# buyiyang
谢谢大佬指点!我这里win10上find查找失败了,如果如楼主所说
在win7的cmd里面,echo ^[[38;5;36;40mXXX 显示的是 ←[38;5;36;40mXXX
应该可以呀。
作者: 77七 时间: 2024-7-4 19:38
win10系统,试了将find "38" 的结果重定向到文本。分号变成空格了。
作者: hnfeng 时间: 2024-7-4 20:15
本帖最后由 hnfeng 于 2024-7-4 20:22 编辑
回复 77七
这样应该不行,输出的依然是控制字符,只是被终端解析执行后显示不同而已。
buyiyang 发表于 2024-7-4 19:12
是的是的,win10里面看上去都是 XXX,但是比较结果不一样,有一些转义符没显示出来
在win7里面和win10里面结果总是一样,判断结果总是同一个
作者: hnfeng 时间: 2024-7-4 20:24
在win7和win10里面判断结果总是一样的- @echo off
- for /f "delims=#" %%i in ('prompt #$E#^&echo on^&for %%a in ^(1^) do rem') do set EscK=%%i
-
- for /f "delims=" %%a in ('echo %EscK%[36;5;36;40mXXX') do (
- rem echo %%a
- if "%%a" EQU "XXX" (
- echo Win10
- ) else (
- echo Win7
- )
- )
- pause
- exit /b
复制代码
作者: Five66 时间: 2024-7-4 20:27
回复 7# 77七
分号变空格是因为for中的echo的分号 被去掉了
作者: Five66 时间: 2024-7-4 20:39
或许可以查询注册表看看 HKCU\CONSOLE 下有无 VirtualTerminalLevel 这个值
还有官网抄了段C代码,不知行否 (建议用msvc和1803以上的sdk编译)
运行后返回值0表示支持,1不支持,其他值出错- #include <stdio.h>
- #include <wchar.h>
- #include <windows.h>
-
- /*
- https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#output-sequences
- */
-
- int main()
- {
- // Set output mode to handle virtual terminal sequences
- HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
- if (hOut == INVALID_HANDLE_VALUE)
- {
- return 3;
- }
-
- DWORD dwMode = 0;
- if (!GetConsoleMode(hOut, &dwMode))
- {
- return 2;
- }
-
- dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
- if (!SetConsoleMode(hOut, dwMode))
- {
- return 1;
- }
-
- return 0;
- }
复制代码
作者: 77七 时间: 2024-7-4 20:43
回复 10# Five66
谢谢大佬指点!果然如此!
作者: hnfeng 时间: 2024-7-4 22:07
或许可以查询注册表看看 HKCU\CONSOLE 下有无 VirtualTerminalLevel 这个值
还有官网抄了段C代码,不知行 ...
Five66 发表于 2024-7-4 20:39
在win10里面,HKCU\CONSOLE 下有 VirtualTerminalLevel
在win7 和 win11 里面,HKCU\CONSOLE 下无 VirtualTerminalLevel ,也不对哦,win11支持转义的
作者: czjt1234 时间: 2024-7-4 22:43
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 结束。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |