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在此处发现的