我正在尝试创建一个不会清除其上方输出的批处理计时器。
我创建了一个计时器函数,但我希望对其进行改进,以便我仍然可以查看其上方的输出,而无需在输出中倒数行。我当前的功能是:
@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]
有什么办法吗?
答案 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秒内进行操作...
就绪
按任意键继续