批处理文件中的反向换行

Posted

技术标签:

【中文标题】批处理文件中的反向换行【英文标题】:Reverse Line Feed in Batch file 【发布时间】:2021-12-14 04:08:53 【问题描述】:

我正在寻找一种在批处理文件中使用反向换行(如果我正确理解这个概念)的方法。预先列出它 - 它必须是批处理兼容的 - 因为它将运行的安全环境,所以不能使用外部可执行文件。

我有以下设置换行/回车:


REM Produces a Carriage Return effect for use later.
for /f %%a in ('copy "%~f0" nul /z') do set "cr=%%a"
REM Produces a Linefeed effect for later use.  WARNING - must keep 2 lines of code blank after this command!
set lf=^


现在,这可以按预期使用set /p 提示等产生很酷的效果。我想要完成的是使用此方法的带有“文本框”的提示,但类似于以下内容:


set /p "var=*************************************************************************************!lf!!cr!* Enter the Street Address of this Store.  [Use as many characters as you need]     *!lf!!cr!* Address:_____________________________________________________________________     *!lf!!cr!*************************************************************************************!REVERSE_LF!!cr!* Address:"

REM Intended Output:

REM NOTE placed a | symbol to indicate where expected cursor would be when user is typing the Address

REM *************************************************************************************
REM * Enter the Street Address of this Store.  [Use as many characters as you need]     *
REM * Address:|____________________________________________________________________     *
REM *************************************************************************************

现在,我以前做过一些非常相似的事情来实现类似的目标,但未能成功地提供一个带有边框的解决方案。

下面给出的例子与上面几乎相同,但没有边框:


set /p "var=Enter the Street Address of this Store.  [Use as many characters as you need]!lf!!cr!Address:_____________________________________________________________________!cr!Address:"

Rem Output:

Rem Note: as before - using pipe symbol to indicate where cursor is when using this method

Rem Enter the Street Address of this Store.  [Use as many characters as you need]
REM Address:|____________________________________________________________________

Windows 命令行/批处理文件语法有这样的东西吗?

【问题讨论】:

如果没有外部可执行文件,这是不可能的。 Windows 不直接支持在批处理文件中指定光标位置。见***.com/q/4357113/62576 我很欣赏这种情绪,但我不是试图精确定位鼠标坐标,也不是使用鼠标放置光标。在给出的第二个示例中,光标被放置在Address: 的末尾(正确地我可能会添加 - 多次使用)以在用户键入行时覆盖下划线行。我知道在 linux 和其他语言中,有一种方法可以确定反向换行(Windows 环境 - 使用其他语言的能力有限),但我希望以某种方式将反向换行分配给变量以使用它批处理文件中的效果。 另外,我对 VBScript 示例持开放态度,但我仍需要将反向换行分配给批处理文件中正在使用的变量。 没有使用本机 Windows 批处理文件功能的 反向换行 之类的东西,这是我在之前的评论中特别提到的。您必须使用外部应用程序。 当 - 我的回应主要是由于所提供文章的内容与询问无关。有没有办法利用 powershell 或 VBScript 从批处理环境中分配变量? 【参考方案1】:

就像@Ken White 已经说过的那样,没有reverse line feed,但您可以使用 VT100(ANSI 转义码)来移动光标,至少在 windows10 上是这样。

@echo off

REM Produce an escape character
for /F "delims=#" %%a in ('"prompt #$E# & for %%a in (1) do rem"') do set "ESC=%%a"

echo **********************
echo * Address: _________ *
echo **********************
set /p "=%ESC%[2A%ESC%[11C" < nul
set /p Address=

ESC[2A - 将光标向上移动两行ESC[11C - 将光标向右移动 11 个位置

甚至更好,不计较

echo **********************
echo * Address: %ESC%7_________ *
echo **********************
set /p "=%ESC%8" < nul
set /p Address=

ESC7 - 保存当前光标位置ESC8 - 恢复上次保存的光标位置

【讨论】:

我现在也在 Windows Server 2019 上进行了测试——类似的架构——它也可以在这里工作。 不确定这是否会一直存在,但这里有一个关于转义序列的相当快速的参考指南(最后一页):ecse.rpi.edu/courses/CStudio/Old%20MPS%20Labs/…我以前从未听说过这个。令人着迷的东西。 @k1dfr0std 这个 ANSI 东西是相当新的(对于 Windows)。自 1979 年以来,世界其他地方都在使用它 是的,比如this? 我对此一无所知,但很简单prompt $E[41m$P$G$E[m【参考方案2】:

确实,有一个技巧可以生成在任何 Windows 版本中都可以使用的反向换行

@echo off
setlocal EnableDelayedExpansion

rem Generate BS and TAB control characters
for /F %%a in ('echo prompt $H ^| cmd') do set "BS=%%a"
for /F "skip=4 delims=pR tokens=2" %%a in ('reg query hkcu\environment /V temp' ) do set "TAB=%%a"
for /F "tokens=2 delims=0" %%a in ('shutdown /? ^| findstr /BC:E') do if not defined TAB set "TAB=%%a"

rem Assemble the "one line up" control string with the proper number of BSs
for /F "tokens=2" %%a in ('mode con ^| findstr "Col"') do set /A "cntBS=(%%a+7)/8"
set "lineUp=" & for /L %%i in (1,1,%cntBS%) do set "lineUp=!lineUp!!BS!"

echo **********************
echo * Address: _________ *
echo **********************
echo %TAB%!BS!!BS!!lineUp!!lineUp!
set /P "Address=* Address: "

该方法在this post有详细描述,还有另一个例子here。

此方法适用于所有 Windows 版本。为了在 Windows 10+ 中工作,您必须在 cmd.exe 窗口属性中启用 Use Legacy Console。但是,这样做会禁用移动光标的 VT100 ANSI 转义序列。

【讨论】:

我在发布我的问题后看到了这个例子,并认为这是一个很好的方法,但是,有些东西我不允许修改(对此的要求就是其中之一),所以这对我的环境不起作用(经过测试和证明) - 我不怀疑它有能力做需要做的事情,尽管当环境允许这个动作时! 好的,但这意味着您的环境是 Windows 10... 此方法与 10 之前的任何 Windows 版本一样有效。 正确 - 和 Windows Server 2019。我认为将其编辑到我的问题中会有所帮助,但是,几年前当我开始练习批处理时,我所处的环境仍然处理 Windows XP 和Windows 7,我认为这是一个白日梦,所以我非常感谢在这个问题中有这两个答案 - 为任何可能寻找这个的人提供尽可能完整的图片。

以上是关于批处理文件中的反向换行的主要内容,如果未能解决你的问题,请参考以下文章

datstage处理文本文件中存在多余换行符的数据

windows批处理如何替换换行符?

文件处理命令2

批处理 bat 怎样可以把一个txt文本中的换行全部去掉?请大神赐教

开发环境Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 ( 输出 GB2312 格式处理中文乱码 | 换行 | Runtime 执行 Cmd 命令 )

如何在批处理文件中回显换行符?