batch-file - 通过 Windows 10 控制台 VT-100 转义序列获取光标位置

标签 batch-file windows-console ansi-escape

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

特别是,以下报告当前光标位置的序列引起了我的兴趣。

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!

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

C:\test>

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

编辑 - 最后一个要求:我不希望查询响应出现在屏幕上,因为这会扰乱屏幕并改变光标位置。我怀疑这可能是最难破解的坚果,对于纯批次来说可能是不可能的。

最佳答案

三年后的重大变化

它可以使用 XCOPY 读取响应。或 REPLACE .

我正在使用 replace在这里,避免语言依赖问题。

@echo off
for /F "delims=#" %%a in ('"prompt #$E# & for %%a in (1) do rem"') do set "ESC=%%a"

call :get_cursor_pos
exit /b

:get_cursor_pos
set "response="
set pos=2

:_get_loop
REM *** Request Cursor position
<nul set /p "=%ESC%[6n" 
FOR /L %%# in (1 1 %pos%) DO pause < CON > NUL

for /F "tokens=1 skip=1 eol=" %%C in ('"REPLACE /W ? . < con"') DO (
    set "char=%%C"
)
set "response=%response%%char%"
set /a pos+=1
if "%char%" NEQ "R" goto :_get_loop

set response
exit /b

主要问题是,XCOPYREPLACE允许我从输入流中读取一个字符,然后清除剩余的缓冲区。

相反,PAUSE读取一个字符,保留剩余的缓冲区,但不显示读取的字符。

为了解决这个问题,我多次发出查询,每次读取响应的不同字符。对于每次迭代,我使用 2 个或更多 PAUSE 的组合后跟 REPLACE 的语句读取响应的特定字符。每次迭代多使用一个 PAUSE比之前的迭代,直到我能够读取终止的 R。

我开发了这项技术并最初将其发布在 DosTips - Query States using Console Virtual Terminal Sequences.

关于batch-file - 通过 Windows 10 控制台 VT-100 转义序列获取光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38237304/

相关文章:

c++ - 为什么我在使用 ReadConsoleInput 时收到每个键盘事件两次?

shell - 规范地确定光标键的转义序列

c - Windows unicode 控制台应用程序使用什么语言环境 LC_CTYPE?

linux - 与 Windows 写字板兼容的 Linux 上的 Python Colorama 转义序列

C++ Ansi 转义码及其手动完成时的解释

windows - 在后台运行的启动脚本

windows - 在 Jenkins 中运行批处理命令

python - 使用 Python 模块 main 函数进行验证测试是一个坏主意吗?

sql-server - 我可以在一组 Azure 服务器上运行 .bat 文件吗?

c++ - 在 Windows 控制台应用程序中输出 unicode 字符串