Batch file 如何批量而不是整个屏幕清除选中的行?

Batch file 如何批量而不是整个屏幕清除选中的行?,batch-file,cmd,windows-console,Batch File,Cmd,Windows Console,当我们使用暂停时,它显示“按任意键继续…”。按任意键后,后一个文本保留,其余文本显示在其下方。如果在pause之后使用cls,整个屏幕将被清除 按任意键后,是否有任何方法仅删除“按任意键继续…”?另外,如何仅清除选定的行而不是清除整个屏幕?对于此问题有多种解决方案,但batch不提供简单的解决方案 批处理的主要问题是,不能使用普通命令向上移动光标 1) 您可以使用cls清除屏幕并重新绘制所有必要的数据 2) 您可以使用外部程序移动光标(可以动态创建此程序),如 3) 您可以滥用timeout命令

当我们使用
暂停时,它显示“按任意键继续…”。按任意键后,后一个文本保留,其余文本显示在其下方。如果在
pause
之后使用
cls
,整个屏幕将被清除


按任意键后,是否有任何方法仅删除“按任意键继续…”?另外,如何仅清除选定的行而不是清除整个屏幕?

对于此问题有多种解决方案,但batch不提供简单的解决方案

批处理的主要问题是,不能使用普通命令向上移动光标

1) 您可以使用
cls
清除屏幕并重新绘制所有必要的数据

2) 您可以使用外部程序移动光标(可以动态创建此程序),如

3) 您可以滥用
timeout
命令返回第二行,这是由


4) 在Windows 10中,您可以使用Ansi转义序列移动光标并获得许多其他效果,但它仅适用于Win10,在
cmd
中无法删除某些行。但是,我可以提供一个解决方案:

@echo关闭
rem//启用延迟扩展,这是以后输出回车字符所必需的:
setlocal EnableDelayedExpansion
rem//检索回车符:
对于/F%%C in('copy/Z“%~f0“nul'),请设置“CR=%%C”
rem//检索后空位字符:
对于/F%%C in('echo prompt$H^ | cmd'),请设置“BS=%%C”
rem//准备消息文本和一串空格:
设置“字符串=按任意键继续…”
设置“空格=”
rem//使用'set/P'打印消息文本,不带尾随换行符(回车+换行):
set/P=“%STRING%”小于numl
rem//Do`pause`但抑制其消息文本:
暂停>nul
rem/*使用“set/P”首先打印一个不可见的空格字符;这样可以避免出现空白
rem字符首先出现在“set/P”中,因为它不会输出这样的前导字符;
rem然后打印一个回车符,将光标移动到
雷姆电流线;然后在前一条消息文本上加上一串空格以覆盖,然后
清除它;附加一个回车符,以便在其上打印任何其他文本;
rem由于没有尾随换行符,因此在同一行打印任何其他文本:*/
set/P=“%BS%!CR!%SPACES%!CR!”
您还可以使用一个奇怪的技巧,将一个制表符加上几个BS字符,将光标向上移动任意行数:

@echo off
setlocal EnableDelayedExpansion

rem Get a BS and TAB control characters
for /F %%a in ('echo prompt $H ^| cmd') do set "BS=%%a"
set "TAB=   "  &  REM Be sure that TAB variable contains an Ascii 9 character

rem Leave some empty lines and do a PAUSE
echo Three empty lines below + pause
echo/
echo/
echo/
pause

rem Get width of screen buffer, set number of lines to go above
for /F "tokens=2" %%a in ('mode con ^| findstr "Col"') do set /A buffWid=%%a, linesAbove=3

rem Assemble the "go above" control string with the proper number of BSs
set "BSs="
set /A "cntBS = 2 + (buffWid + 7) / 8 * linesAbove"
for /L %%i in (1,1,%cntBS%) do set "BSs=!BSs!!BS!"

rem Move cursor up the desired number of lines
echo %TAB%!BSs!

echo Hello,
echo World
echo This line overwrites the one with PAUSE output
重要信息:必须确保行
set“TAB=“
有效地包含制表符(Ascii 9)字符,而不仅仅是空格

暂停前的输出:

Three empty lines below + pause



Presione una tecla para continuar . . .
Three empty lines below + pause

Hello,
World
This line overwrites the one with PAUSE output
。。。暂停之后:

Three empty lines below + pause



Presione una tecla para continuar . . .
Three empty lines below + pause

Hello,
World
This line overwrites the one with PAUSE output
在Windows8.1上测试


此方法由DosTips用户neorobin发现,详细描述见。

为什么不在暂停继续后再次打印所有文本?我从未想过!但是有没有办法只清除选中的行而不是清除整个屏幕?第一个选项在我看来非常有效。谢谢:)应该提到的是,此代码可以修改当前行。这可以用来取得进展indicators@jeb,我不会叫它“修改”,而是叫它“覆盖”;我现在在评论中提到了这一点。无论如何,我必须修正我的方法,因为延迟扩展需要返回CR,并且要解决
set/P
不返回前导空格这一事实……直到我注意到我的编程编辑器设置为将制表符转换为空格,我才能够使它工作。我正在运行记事本,以便在需要时随时放置选项卡,直到我在('shutdown/?^ findstr/bc:'E')中找到了/F“tokens=2 delims=1234567890”%%的
do set“TAB=%%”
。。。所以不再需要填充便笺;-)。这是用户aGerman在此处发现的