Batch批处理脚本如何固定顶部Logo使其不随聊天内容滚动
Batch脚本固定顶部Logo+滚动聊天区实现方案
实现逻辑
纯Batch原生没有窗口分区接口,采用以下逻辑实现需求:
- 预先统计ASCII Logo+版本信息一共占用14行,将这部分定义为固定头部,每次刷新界面时优先绘制
- 新增聊天记录数组存储所有历史对话,每次用户输入、机器人回复后,先清屏再重绘固定头部,最后输出指定范围内的聊天记录
- 如需滚动查看历史,可新增页码变量,通过捕获用户按键调整显示的历史记录偏移量即可实现翻页功能
修改后的完整代码
@echo off Mode con cols=90 lines=50 color 0B for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (set "DEL=%%a") setlocal EnableExtensions EnableDelayedExpansion set "BotName=Amanda" set "Name=Ikki" set "Lines=" set "Columns=" for /F "tokens=1,2 delims=: " %%I in ('%SystemRoot%\System32\mode.com') do if "%%I" == "Lines" (set "Lines=%%J") else if "%%I" == "Columns" set "Columns=%%J" <nul set /p="" %SystemRoot%\System32\mode.com CON COLS=100 LINES=35 color 0b title A.I. Chat Bot Amanda 0.2 :: 配置参数:Logo占用行数、聊天区显示行数 set "LOGO_LINES=14" set "CHAT_SHOW_LINES=18" set "chat_cnt=0" :: 初始欢迎消息加入历史 set /a chat_cnt+=1 set "chat[!chat_cnt!]=<bot>: Hello I'am A.I. Chatbot but my users call me Amanda." ping localhost -n 3 > nul :DrawUI cls :: 绘制固定头部Logo echo. echo __ ____ ___ _ _ __ ____ ____ _____ ____ echo /__\ (_ _) / __)( )_( ) /__\ (_ _) ( _ \( _ )(_ _) echo /(__)\ _)(_ ( (__ ) _ ( /(__)\ )( ) _ )(_)( )( echo (__)(__)()(____)() \___)(_) (_)(__)(__) (__) (____/(_____) (__) echo. echo __ __ __ __ _ _ ____ __ echo /__\ ( \/ ) /__\ ( \( )( _ \ /__\ echo /(__)\ ) ( /(__)\ ) ( )(_) ) /(__)\ echo (__)(__)(_/\/\_)(__)(__)(_)\_)(____/ (__)(__) echo. echo. echo (Prototype Version 0.2) echo/ echo. echo. :: 绘制聊天记录:显示最近CHAT_SHOW_LINES条 set "start_line=1" if !chat_cnt! GTR !CHAT_SHOW_LINES! set /a start_line=chat_cnt - CHAT_SHOW_LINES + 1 for /L %%i in (!start_line! 1 !chat_cnt!) do ( set "line=!chat[%%i]!" if "!line:~0,4!" == "<bot>" ( ECHO >nul && call :PainText 0C %BotName% echo !line:~4! ) else if "!line:~0,5!" == "<user>" ( ECHO >nul && call :PainText 9 "%Name%" echo !line:~5! ) ) :Begin echo. ECHO >nul && call :PainText 9 "%Name%" set "TALK=" set /P "TALK=: " echo. :: 空输入处理 if not defined TALK ( ECHO >nul && call :PainText 0C "%BotName%" echo : TYPE SOMETHING, PLEASE! pause >nul goto DrawUI ) set "TALK=!TALK:?=!" if not defined TALK ( ECHO >nul && call :PainText 0C "%BotName%" echo : TYPE SOMETHING, PLEASE! pause >nul goto DrawUI ) :: 过滤特殊字符 set "TALK=!TALK:"= !" set "TALK=!TALK:<= !" set "TALK=!TALK:>= !" set "TALK=!TALK:|= !" set "TALK=!TALK:&= !" set "TALK=!TALK:)= !" if /I "%TALK%" == "exit" goto EndBatch :: 用户输入加入历史 set /a chat_cnt+=1 set "chat[!chat_cnt!]=<user>: %TALK%" set "Output=:" :: 匹配回复 echo %TALK% | %SystemRoot%\System32\findstr.exe /I /R "\<hi\>" >nul && call :Hi echo %TALK% | %SystemRoot%\System32\findstr.exe /I /R "\<hello\>" >nul && call :Hello if "%Output%" == ":" set "Output=%Output% Sorry, I don't understand your last input." :: 机器人回复加入历史 set /a chat_cnt+=1 set "chat[!chat_cnt!]=<bot>%Output%" goto DrawUI :Hi :Hello set /A Number=%RANDOM% %% 11 if %Number% == 0 set "Output=%Output% Hello, %name%!" & goto :EOF if %Number% == 1 set "Output=%Output% What's up?" & goto :EOF if %Number% == 2 set "Output=%Output% How is your day going?" & goto :EOF if %Number% == 3 set "Output=%Output% Konichiwa %name%!" & goto :EOF if %Number% == 4 set "Output=%Output% Yo!" & goto :EOF if %Number% == 5 set "Output=%Output% Whazzup %name%!" & goto :EOF if %Number% == 6 set "Output=%Output% Ohayo ;)" & goto :EOF if %Number% == 7 set "Output=%Output% Hi I love you %name%!" & goto :EOF if %Number% == 8 set "Output=%Output% Hi, what's up?" & goto :EOF if %Number% == 9 set "Output=%Output% How's it going?" & goto :EOF set "Output=%Output% Hey %Name%! Good to see you!" & goto :EOF :PainText <nul set /p "=%DEL%" > "%~2" findstr /v /a:%1 "+" "%~2" nul del "%~2" > nul goto :eof :EndBatch color if defined Lines if defined Columns %SystemRoot%\System32\mode.com CON COLS=%Columns% LINES=%Lines% endlocal
补充说明
- 如果觉得界面闪烁明显,可以调整
CHAT_SHOW_LINES参数减少每次重绘的内容量 - 如需添加滚动功能,可扩展使用
choice命令捕获PageUp/PageDown按键,调整start_line的计算逻辑即可实现翻页查看全部历史记录
内容的提问来源于stack exchange,提问作者Ikki789
相关产品推荐
相关产品推荐

