Таймер обратного отсчета партии, который не очищает остальную часть вывода?

Я пытаюсь создать пакетный таймер, который не очищает вывод над ним.

У меня есть функция таймера, но я хочу улучшить ее, чтобы я мог просматривать вывод над ней, не имея строк в строках обратного отсчета в выводе. Моя текущая функция:

@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]

Есть какой-либо способ сделать это?

будет ли полезна команда тайм-аут? (Попробуйте timeout 10) Если нет - то почему?

Stephan 27.05.2019 22:16

@Stephan, команда тайм-аута не печатает вывод, который я ищу, и вывод является основным моментом этого таймера. Обычно это срабатывало.

Londala 27.05.2019 23:23

Уважительная причина. Выберите один из ответов ниже. Имейте в виду, что решение ANSI работает не во всех версиях Windows.

Stephan 28.05.2019 10:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
275
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это можно сделать с помощью специальных символов, возврата каретки или забоя.

Возврат каретки перемещает курсор обратно в начало строки.
Но чтобы оказаться на той же строке, что и текст 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

Другие вопросы по теме