Я пытаюсь создать пакетный таймер, который не очищает вывод над ним.
У меня есть функция таймера, но я хочу улучшить ее, чтобы я мог просматривать вывод над ней, не имея строк в строках обратного отсчета в выводе. Моя текущая функция:
@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]
Есть какой-либо способ сделать это?
@Stephan, команда тайм-аута не печатает вывод, который я ищу, и вывод является основным моментом этого таймера. Обычно это срабатывало.
Уважительная причина. Выберите один из ответов ниже. Имейте в виду, что решение ANSI
работает не во всех версиях Windows.
Это можно сделать с помощью специальных символов, возврата каретки или забоя.
Возврат каретки перемещает курсор обратно в начало строки.
Но чтобы оказаться на той же строке, что и текст 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
)
Другой способ многократного вывода строк любой длины в одну и ту же строку — использование последовательностей 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
Этот пакетный файл обратного отсчета
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
Вывод после выполнения скрипта:
Hello
Proceeding in 0 seconds...
Ready
Press any key to continue
будет ли полезна команда тайм-аут? (Попробуйте
timeout 10
) Если нет - то почему?