批处理文件 – Windows 10控制台VT-100转义序列

我正在玩
Windows 10控制台中对VT-100转义序列的新(有限)支持.支持的序列记录在
https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx.

我正在使用批处理文件来测试这些功能,并且我能够获得几乎所有已记录的功能.但我在“视口定位”序列(向上/向下滚动)方面遇到麻烦 – 在我手中它们完全失效(没有效果)

ESC[<n>S  -  Scroll Up <n> lines
ESC[<n>T  -  Scroll Down <n> lines

任何人都可以在任何情况下让他们工作,或者MS文档是否完全错误?

此外,还有标准的查询序列,MicroSoft没有记录,但似乎工作.
特别是,报告当前光标位置的以下序列使我感兴趣.

ESC[6n - responds with ESC[<n>;<m>R, 
         where <n> is the row number, and <m> the column number

响应作为键盘输入传递,并显示在屏幕上,但我不知道如何以编程方式使用这些信息.理想情况下,我想得到< n>和< m>从批处理文件中将值转换为环境变量.

但是,如果任何人都可以演示如何使用任何语言捕获变量,那么我可以使用该知识来开发有效的批处理文件策略.

我可以使用以下名为ANSI.BAT的简单脚本来完成

@echo off
setlocal enableDelayedExpansion

for /f "delims=" %%C in (
  'forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(0x1B"'
) do set "esc=%%C"
set "csi=%esc%["

echo(Inquiry:%csi%6n
set /p "pos="
echo response=!pos:%esc%=ESC!

–OUTPUT–

C:\test>ansi
Inquiry:
^[[3;9R
response=ESC[3;9R

C:\test>

一旦我在变量中得到响应,我就可以使用FOR / F轻松地解析出值.我遇到的问题是我必须手动按< Enter>响应出现在屏幕上以便终止我的SET / P语句的输入.我很难过从这里去的地方……

编辑 – 最后一个要求:我不希望查询响应出现在屏幕上,因为它会中断屏幕,并改变光标位置.我怀疑这可能是最难解决的问题,纯正的批次可能是不可能的.

最佳答案 我没有Windows 10,所以我无法完成任何测试.但是,如果Ansi ESC [6n序列的响应是用ESC [< n>;< m> R字符填充键盘输入缓冲区,那么只需要将Enter键添加到这样的输入中以便读取它通过SET / P命令,这可以通过SendKeys JScript方法完成.

我还使用了一个更简单的方法来获取变量中的ESC字符.

编辑:我相应地修改了代码评论…

@if (@CodeSegment == @Batch) @then

@echo off
title Ansi Test
setlocal EnableDelayedExpansion

for /F %%a in ('echo prompt $E ^| cmd') do set "esc=%%a"
set "csi=%esc%["

echo Inquiry:%csi%6n
cscript //nologo //E:JScript "%~F0"
set /p "pos=" > NUL
echo response=!pos:%esc%=ESC!

@end

var sh = WScript.CreateObject("WScript.Shell");
sh.AppActivate("Ansi Test");
sh.SendKeys("{ENTER}");

请发布结果……

点赞