批次倒数计时器无法清除其余的输出?

时间:2019-05-27 17:53:30

标签: batch-file

我正在尝试创建一个不会清除其上方输出的批处理计时器。

我创建了一个计时器函数,但我希望对其进行改进,以便我仍然可以查看其上方的输出,而无需在输出中倒数行。我当前的功能是:

@echo off
echo KEEP THIS OUTPUT
CALL :timer 10
rem Do more things...
EXIT

:Timer
set time=%~1

:loop
cls

echo Countdown - [%time%]

set /a time=%time%-1
if %time%==0 goto timesup

ping localhost -n 2 > nul
goto loop

:timesup
echo Timer completed!!
EXIT /B 0

当前,计时器清除了屏幕,但我想这样做,以便保留此计时器上方的输出。

例如,在10秒时,输出应为:

KEEP THIS OUTPUT
Countdown - [10]

然后输出应更改为:

KEEP THIS OUTPUT
Countdown - [9]

输出不应为:

KEEP THIS OUTPUT
Countdown - [10]
Countdown - [9]

并且不应为:

Countdown - [9]

有什么办法吗?

3 个答案:

答案 0 :(得分:2)

可以使用特殊字符,回车符或退格键来完成。

回车将光标移回该行的开头。
但是要与Countdown文本位于同一行,您不能使用echo命令,因为它总是会附加一个换行符。
相反,我使用set /p命令来避免这种情况。

@Echo off 
setlocal EnableDelayedExpansion
for /F %%# in ('copy /Z "%~dpf0" NUL') do set "CR=%%#"

for /L %%n in (10 -1 0) do (
    <nul set /p ".=Countdown[%%n] !CR!"
    ping localhost -n 2 > nul
)

答案 1 :(得分:1)

将任意长度的字符串重复输出到同一行的另一种方法是使用Ansi ESC序列
(在Windows 10> = Treshold2的控制台中再次受支持)。

由于某些编辑器在创建/保存到批处理文件时遇到问题,因此使用certutil进行创建。

:: Q:\Test\2019\05\27\SO_56330510.cmd
@echo off
if not defined ESC call :GetEsc
echo KEEP THIS OUTPUT
CALL :timer 10
rem Do more things...
EXIT /B

:Timer
Echo Countdown - [%1]
For /l %%L in (%1,-1,0) Do Echo %Ansi%Countdown - [%%L]&Timeout /t 1 >Nul
echo %Ansi%Timer completed!!
EXIT /B 0

:GetEsc just in case you can't create and save the ESC[ sequence in your editor
echo 1B 5B>ESC.hex
Del ESC.bin >NUL 2>&1
certutil -decodehex ESC.hex ESC.bin >NUL 2>&1
Set /P ESC=<ESC.bin
set "Ansi=%ESC%1F%ESC%0J"
Del ESC.* >NUL 2>&1

答案 2 :(得分:0)

此批处理文件倒计时

  • 不清除屏幕的其余部分
  • 甚至有条件(在if内)工作

@echo off
echo Hello

set CountDownNecessary=1

if %CountDownNecessary%==1 (
    REM ### Countdown Start ###
    set CountdownStartValue=5
    setlocal EnableDelayedExpansion
    for /F %%# in ('copy /Z "%~dpf0" NUL') do set "CR=%%#"
    for /L %%n in (!CountdownStartValue! -1 -1) do (
        <nul set /p ".=!CountdownText! !CR!"
        if not "!CountdownText!"=="" ping localhost -n 2 > nul
        set CountdownText=Proceeding in %%n seconds...
    )
    echo.
    REM ### Countdown End ###
)
echo Ready
pause

执行脚本后的输出:

你好
在0秒内进行操作...
就绪
按任意键继续