Таймер обратного отсчета партии, который не очищает остальную часть вывода? - PullRequest
1 голос
/ 27 мая 2019

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

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

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

Другой способ вывода строк любой длины в одну и ту же строку - использование последовательностей ESC Ansi
(которые снова поддерживаются в консоли 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...