Отметка времени для каждого эхо в формате чч: мм: сс с ведущим нулем в пакете - PullRequest
1 голос
/ 21 июня 2020

Я ищу метку времени каждые echo с hh:mm:ss в пакете. Я использовал %time:~0,-3%, и он отлично работал, пока мне не пришлось использовать set /p. Он пропустил начальный пробел одиночного di git часов, что сделало строку смещенной по сравнению с остальными.

Пример:

@echo off
echo %time:~0,-3% Hello world!
echo %time:~0,-3% It's a sunny day outside.
set /p "state=%time:~0,-3% How are you? "
echo %time:~0,-3% That's great!
pause >nul

Вывод:

 1:59:55 Hello world!
 1:59:55 It's a sunny day outside.
1:59:55 How are you?
 2:00:02 That's great!

I можно было бы использовать set ctime=%time:~0,3%%time:~3,3%%time:~6,2% и echo %ctime: =0% после, но это привело бы к множеству избыточных строк.

Есть ли способ объединить %time:~0,-3% и %time: =0%? Это бы меня разобрало.

Или, может быть, заставить set /p не пропускать пробел? Это тоже сработает.

Ответы [ 4 ]

3 голосов
/ 21 июня 2020

Для повторяющихся задач хорошим решением является подпрограмма:

@echo off
set "stamp=call :stamp"

%stamp% & echo Hello world!
%stamp% & echo It's a sunny day outside.
%stamp% & set /p "state=How are you? "
%stamp% & echo That's great!
pause >nul

:stamp
set "t=%time: =0%"
<nul set /p "=%t:~0,-3%: "

Пример вывода:

11:23:15: Hello world!
11:23:15: It's a sunny day outside.
11:23:15: How are you? not that good...
11:23:23: That's great!

Преимущество: когда есть больше задач, которые нужно выполнить (здесь: заменить пробел с 0 и сократить миллисекунды), все это происходит в подпрограмме (в одном месте). Легко поддерживать и сохраняет ваш основной код в чистоте.

Вместо call :stamp & echo Line to print вы можете использовать псевдомакрос (%stamp%) (как я), но это зависит от вас.

2 голосов
/ 21 июня 2020

Хотя это не приносит никаких новых приемов для вечеринки, вместо уже сделанных предложений , я разместил его, потому что я действительно не думаю, что есть необходимость ожидать ответа на та же линия. (Мы не делаем этого в онлайн-чате или приложениях для обмена сообщениями) . Поэтому идея состоит в том, чтобы использовать только Echo для повествования / вопросов, (таким образом, не имея проблем с потерей пробела) , и дать конечному пользователю новую строку для ввода Set /P:

@Echo Off
For /F %%G In ('"Prompt $H&For %%H In (1)Do Rem"')Do Set "input=%%G       > "
Echo %TIME:~,-3% Hello world!
Echo %TIME:~,-3% It's a sunny day outside.
Echo %TIME:~,-3% How are you?
Set /P "state=%input%"
Echo %TIME:~,-3% That's great!
Echo %TIME:~,-3% You are %state%.
Pause>NUL

Ожидаемый результат:

 9:59:54 Hello world!
 9:59:54 It's a sunny day outside.
 9:59:54 How are you?
       > okay
10:00:01 That's great!
10:00:01 You are okay.
2 голосов
/ 21 июня 2020

Вы можете использовать небольшую хитрость, записав возврат в переменную.

@echo off

:: Define BS to contain a backspace
for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "BS=%%a"
echo %time:~0,-3% Hello world!
echo %time:~0,-3% It's a sunny day outside.
set /p "state=_%BS%%time:~0,-3% How are you? "
echo %time:~0,-3% That's great!
pause
0 голосов
/ 21 июня 2020

Я бы создал такую ​​переменную отметки времени:

set ts=%time: =0%

И использовал бы ее для всех отметок времени в вашем файле.

Этот синтаксис заменяет все пробелы на 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...