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

2023-11-27

我正在尝试 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> and <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 语句的输入。我很困惑从这里该去哪里......

EDIT- 最后一个要求:我不希望查询响应出现在屏幕上,因为这会破坏屏幕并更改光标位置。我怀疑这可能是最难破解的难题,也许对于纯批次来说是不可能的。


三年后的重大变化

它可以通过使用来读取响应XCOPY or 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

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

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

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

我开发了这项技术并最初将其发布在DosTips - 使用控制台虚拟终端序列查询状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 Windows 10 控制台 VT-100 转义序列获取光标位置 的相关文章

  • 使用 psexec 远程执行时,脚本中的 Reg 查询不起作用

    我最近得到了一个脚本 用于查询 reg 的临时文件夹路径并清理该文件夹 它工作得很好 感谢 Compo 但是当与 psexec 远程使用时 它说 系统无法找到指定的注册表项或值 在使用 PSEXEC 执行批处理之前 我首先将其复制到 C 然
  • 有没有更有效的方法通过ffmpeg批量添加水印和加入视频?

    我有这个批处理文件 使用 ffmpeg 在我的视频中添加徽标 然后添加简介 但需要 10 小时到一天的时间 具体取决于我需要添加水印的数量 是否有更有效的方法来实现此目的 视频有时具有不同的分辨率 因此我无法删除到 1280 720 尺寸的
  • 如何使用批处理文件将多个命令插入到批处理文件中

    我正在制作一个批处理文件 我们称之为 Create bat 它将创建一个批处理文件 我们称之为 Created bat 该文件将在其中插入多个命令 其中一条命令如下 FOR F x IN tasklist NH FI IMAGENAME e
  • 找到第一个命中后停止 DIR 命令搜索

    在 CMD EXE 中我可以使用以下命令搜索某些内容DIR 以下面的例子为例 DIR C EXCEL EXE A D B S 虽然需要一段时间才能看清C 盘的整个结构 但是第一次匹配还是比较快的 Q 有没有办法自动地一旦发现命中 就停止命令
  • REG ADD - 语法无效

    我试图通过在批处理文件中使用以下代码行来修改注册表中的值 但当我在参数周围使用双引号时 我不断收到 错误 语法无效 而当我使用单引号时 我不断收到 无效的键名 REG ADD HKLM SOFTWARE Microsoft Windows
  • 使用 set /p 更新批处理脚本的变量始终包含最后一个值

    我正在尝试使用 set p 命令在循环内调整 Windows 批处理变量 键盘输入后 变量仍然包含旧值 我读到通过 set p 设置的变量仅具有本地范围 但我不明白 本地 在这里的真正含义 echo off setlocal EnableD
  • 批处理文件递归复制目录

    有没有办法在 bat 文件中递归复制目录 有这样的例子吗 调查xcopy https learn microsoft com en us windows server administration windows commands xcop
  • 我应该如何传递密码(包含特殊字符)作为命令行参数?

    我有一个部署脚本 必须将 LDAP 密码作为命令参数传递给该脚本 实际密码 foo ser ver 1 包含三个空格字符 开头 之前1 之后1 e g bin gt deployment bat LDAPPassword foo ser v
  • 如何获取%CD%的父路径

    如何获取当前 CD 的父路径 例如 ECHO CD result C Windows System32 这不起作用 ECHO CD 期望的结果 C Windows 尝试更改当前目录 然后使用 cd pushd echo cd popd
  • 使用脚本清除 Internet Explorer 6.0 浏览历史记录

    我使用以下脚本删除 IE 7 0 中的浏览历史记录 RunDll32 exe InetCpl cpl ClearMyTracksByProcess 255 但现在我需要一个脚本来清除 IE 6 0 中的浏览历史记录 我收到一条错误消息 缺少
  • 批处理文件无法在条件语句中设置环境变量

    为什么 Windows 批处理文件输出以下内容Foo其次是Bar 而不是Baz echo off setlocal set Foo echo set Bar if 1 1 set Baz echo 我的系统 Microsoft Window
  • 批处理文件 FOR /f 标记

    任何人都可以逐行准确解释以下代码是如何工作的 我真的迷路了 我一直在尝试学习如何使用 FOR 命令 但我不明白这一点 echo off for f tokens delims f in myfile do set line f call p
  • 如何从Windows阻止社交媒体[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想根据时间阻止我的电脑上的社交媒体 晚上 9 点后屏蔽 上午 11 点后解锁 如家长控制 我尝试过关注但失败了 创建了
  • 获取给定卷的驱动器号?

    给定硬盘卷名 如何在 Windows 7 中使用批处理文件获取驱动器号 Using 电源外壳 questions tagged powershell Get WMIObject Win32 logicaldisk where volumen
  • 用于创建计划任务的 VBScript

    我正在尝试创建一个 VBScript 它创建一个批处理文件 然后创建一个计划任务来运行该批处理文件 到目前为止 我尝试过的所有操作都创建了批处理文件 但没有创建计划任务 并且我没有收到任何错误 这是我到目前为止所拥有的 Option Exp
  • Grep 批量 ping

    寻找一种更好的方法来做到这一点 而不是我习惯的 手动 方法 因为这是一个我必须定期经历的过程 我有一系列要 ping 的 IP 从10 0 1 15 to 10 0 50 15 第三个八位位组指的是物理位置 最后一个八位位组指的是该位置处的
  • 批处理文件 FOR/f 扩展

    我有一个文件 directories txt 与目录名称 每个在一行上 我喜欢扩展该行 C Documents and Settings USERNAME My Documents 在我的脚本中以真实用户名运行脚本 然而 回声与线路完全相同
  • 使用 ICACLS 将文件权限设置为“只读”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我很难从简单 直观的方式转变过来chmod 400尝试在 Windows 命令提示符中执行相同的操作ICACLS 与 UNIX LINUX
  • 指定执行批处理文件时命令提示符的大小

    编辑 如何指定命令提示符的字体和窗口的大小 我使用的是 Windows 7 专业版 好的 抱歉 我正在尝试使用命令来执行上述操作 所以我不接受那些 按属性 的答案 如果您想以编程方式更改控制台字体大小 请参阅这一页 https 4sysop
  • 如何在命令提示符中仅显示具有备用数据流的文件

    我知道要在命令提示符中显示所有文件 如果有 的备用数据流 这是命令dir R 但是 如果我只想显示具有备用数据流的文件 该怎么办 dir s r findstr e DATA or dir r findstr e DATA 第一个将在所有子

随机推荐

  • 如何在C#中使用迭代器反向读取文本文件

    我需要处理一个大文件 大约400K行和200M 但有时我必须从下往上处理 我如何在这里使用迭代器 yield return 基本上我不喜欢将所有内容加载到内存中 我知道在 NET 中使用迭代器效率更高 向后读取文本文件确实很棘手 除非您使用
  • 覆盖 R 中 C++ 编译标志的系统默认值

    我正在使用 RcppEigen 为我的 R 代码编写一些 C 函数 并且我想尽可能优化它们的编译 当我过去使用 Eigen 时 O3 和 fopenmp 给我带来了显着的提升 关注德克的advice 我编辑了 R Makevars 以便我的
  • EventLogQuery:如何形成查询字符串?

    我有以下代码 string query EventLogQuery elq new EventLogQuery Application PathType LogName query elq Session new EventLogSessi
  • Google Apps 脚本中的简单弹出窗口或对话框

    我正在寻找简单的代码 在我的 Google Apps 脚本 Ui 中添加一个弹出窗口 当我点击提交按钮时会出现该弹出窗口 弹出框将显示一条消息并有一个用于关闭弹出窗口的按钮 我已经看遍了所有地方 一切看起来都很复杂 而且做的事情比我需要做的
  • Jboss Fuse ESB 入门

    我是 ESB 新手 正在尝试了解 ESB 概念和实际用例 我研究了几个开源 ESB 产品 似乎 Apache Camel 是最有名的 一位 来自阿帕奇家族 我发现 大多数人使用在 Apache Camel 上开发的 Jboss Fuse 或
  • 焦点在 IE 中不起作用

    我有以下功能 function change var input document getElementById pas var input2 input cloneNode false input2 type password input
  • 本地主机的自签名 SSL 证书,如何使其可信

    我有一个 Owin 自托管 C 应用程序 它通过 127 0 0 1 5555 提供 Web API 服务 它只侦听本地主机 没有外部连接 这些 Web API 服务是使用 Ajax 从 AngularJS 应用程序调用的 顺便说一句 Ow
  • 使用 API 路由时,未授权时返回 Http Response 401,而不是重定向到登录页面

    我正在使用 MVC 和 WebAPI 构建一个 ASP NET Core 2 0 网站 以提供对一系列微服务的访问 WebAPI 控制器要求用户进行身份验证和授权 使用Authorize属性 任何未经授权或未登录的用户都会收到作为 MVC
  • Sun 的 Java 包命名约定:sun 与 com.sun

    在JRE中 Sun的内部包以2个顶级域 sun和com 为前缀 例如 com sun security jgss sun security jgss 对我来说 他们选择哪个前缀似乎很随机 我很好奇Sun 为此使用什么规则 不是问题的答案 但
  • 如何保证在粘贴之前参数完全宏展开?

    我有一个通用宏 define mSwitch Root Case Root Case Case define mSpecialDisplay what Val mSwitch mSpecialDisplay what Val define
  • Java可以连接通配符ssl吗

    我们希望购买通配符 SSL 证书 因为我们有很多子域 但是我不知道Java是否信任通配符证书 当人们通过 SSL 连接到我们的 API 时 我们不足以强制与我们通信的所有第三方将我们的 SSL 证书添加到他们的本地信任库中 目前 我面临着两
  • 使用Python获取pptx文件幻灯片的标题

    我正在尝试使用 Python 获取 powerpoint 文件的每张幻灯片的标题 我正在Python 中使用Presentation 包 但我找不到任何指定标题的内容 我有这段代码返回 powerpoint 文件的内容 但我需要指定标题 f
  • Angular 4 - 如何为 type='input' 渲染 2 位小数

    这个问题是关于当用户将数据输入数字类型的输入时限制 验证输入 我遇到的问题是 当模型首次加载时 任何整数或 1dp 的数字都仅以 1dp 渲染 例如 40 或 40 0 均显示为 40 0 而不是 40 00 我添加了此代码 以便在用户输入
  • AES 算法 - 解密问题

    我已经编写了AES解密代码 但没有成功 我的 AES 算法课程在这里 http pastebin com QtpFnW84和实施是 String Masterkey eX0XcsF8lkeX0XcsF8lkeX0XcsF8lkeX0XcsF
  • 用于 OpenGL ES 的多边形三角剖分为三角形带

    我正在寻找一个快速多边形三角剖分算法可以将不是很复杂的二维凹多边形 无孔 三角化为三角条准备发送到 OpenGL ES 进行绘图GL TRIANGLE STRIP 我知道一些算法 但我找不到适合我需要的算法 http www flipcod
  • SQLite 添加主键

    我使用 Sqlite 创建了一个表CREATE TABLE AS语法基于创建表SELECT陈述 现在这个表没有主键 但我想添加一个 执行中ALTER TABLE table name ADD PRIMARY KEY col1 col2 给出
  • 从 Kendo Grid 数据源导出所有数据

    我按照有关导出 Kendo 网格数据的教程进行操作 http www kendoui c om blogs teamblog posts 13 03 12 exporting the kendo ui grid data to excel
  • C# 8.0 使用 Range 表示多维数组

    在 C 8 0 中 为什么我可以在一维数组上使用 range var oneDim new int 5 var oneDimSlice oneDim 2 4 但不能在多维数组上使用它吗 var twoDim new int 5 5 var
  • EncryptedXml DecryptDocument 方法抛出“错误数据”异常

    我为加密 解密流编写了一个代码块 该代码在我的本地机器上运行 但是当我在网络上发布我的代码时 解密函数抛出 错误数据 异常 这是我的加密和解密函数 private static MemoryStream EncryptStream XmlD
  • 通过 Windows 10 控制台 VT-100 转义序列获取光标位置

    我正在尝试 Windows 10 控制台中对 VT 100 转义序列的新 有限 支持 支持的序列记录在https msdn microsoft com en us library windows desktop mt638032 v vs