bat批处理颜色代码异常 全屏/终止ffmpeg错乱及代码优化求助
故障原因
颜色错乱核心是两个问题:
- ANSI颜色转义码写法不规范:代码里直接写
[32m、[0m这类片段,缺少最关键的ESC前缀(ASCII值为27的不可见控制字符),导致cmd终端无法正确识别颜色指令,设置的样式属性无法被正常解析、清除。 - 缺少样式重置逻辑:调用ffmpeg前手动开启了绿底高亮样式,但既没有在ffmpeg运行结束后主动重置终端默认样式,也没有处理用户按Ctrl+C终止脚本、窗口切换全屏触发控制台重绘的场景,残留的颜色属性会直接应用到整个窗口,出现满屏异色的错乱效果。

修复&优化方案
- 脚本开头预先获取ESC控制字符,定义好常用颜色常量和全局重置指令,避免手写转义码出错
- 兼容Windows终端VT100转义规则,保证颜色指令在Win10/11的cmd环境下正常生效
- 增加兜底重置逻辑:不管ffmpeg是正常跑完、还是被用户手动终止,都第一时间输出重置指令还原终端默认样式
- 精简原代码冗余逻辑(比如重复的
@echo off、无效分支判断),修复原日期时间拼接在不同系统区域设置下失效的问题,预留其他浏览器分支扩展位置
优化后完整代码
@echo off setlocal enabledelayedexpansion :: 初始化ANSI转义支持 for /f %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a" set "RESET=%ESC%[0m" set "GREEN=%ESC%[32m" set "BLUE=%ESC%[34m" set "YELLOW=%ESC%[33m" set "RED=%ESC%[31m" set "BRIGHT_RED=%ESC%[1;31m" set "BG_GREEN_BOLD=%ESC%[1;42m" title Stream Recorder cls :: 启动时先重置终端样式,清历史残留 echo %RESET%Stream Recorder echo( echo %GREEN%1. Chrome%RESET% echo %BLUE%2. Edge%RESET% echo %YELLOW%3. Firefox%RESET% echo %RED%4. Opera%RESET% echo %BRIGHT_RED%5. Vivaldi%RESET% :choice set "choice=" set /p "choice=* Pick your browser (between 1-5): " if not defined choice ( echo Invalid input, try again. echo( goto choice ) set "choice=%choice:~0,1%" if "%choice%"=="1" goto chrome :: 其余浏览器分支可参照chrome逻辑自行补全 echo "%choice%" is not valid, try again. echo( goto choice :chrome set "address=" set /p "address=* M3U8 Url: " :: 校验URL连通性 for /f %%G In ('%__AppDir__%curl.exe -s -o NUL "%address%" -w "%%{http_code}\n"') Do set "response=%%G" echo %response% if not "%response%"=="200" ( echo %RED%URL is not valid, try again.%RESET% echo( goto chrome ) echo %GREEN%URL check was successful.%RESET% :username set "filename=" set /p "filename=* Streamer Name: " echo( :: 生成通用时间戳,规避系统区域设置差异导致的文件名错误 for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "dt=%%a" set "timestamp=%dt:~6,2%-%dt:~4,2%-%dt:~0,4%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%" set "savepath=%~dp0%filename%_%timestamp%.mp4" echo * Recording:%BG_GREEN_BOLD% :: 调用ffmpeg,运行结束/中断后强制重置颜色 ffmpeg -v warning -hide_banner -stats -user_agent "" -i "%address%" -c copy "%savepath%" echo %RESET% pause :: 脚本退出前最后一次重置,彻底避免样式残留 echo %RESET% endlocal
内容的提问来源于stack exchange,提问作者Lary David
相关产品推荐
相关产品推荐

