在批处理中用 hh:mm:ss 为每个回显加上前导零的时间戳

Timestamp every echo with hh:mm:ss with leading zero in batch

我希望批量为每个 echo 加上 hh:mm:ss 的时间戳。我一直在使用 %time:~0,-3%,在我不得不使用 set /p 之前它一直很好用。它省略了个位数小时的前导 space,使该行与其余部分相比未对齐。

示例:

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

我可以在之后使用 set ctime=%time:~0,3%%time:~3,3%%time:~6,2%echo %ctime: =0%,但这会导致很多冗余行。

有没有办法结合%time:~0,-3%%time: =0%?那会把我解决掉的。

或者强制set /p不要省略space字符?那也行。

我会像这样创建一个时间戳变量:

set ts=%time: =0%

并将其用于文件中的所有时间戳。

该语法将所有空格替换为 0

您可以使用一些技巧,将退格键捕获到变量。

@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

对于重复性任务,子程序是一个很好的解决方案:

@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替换space并减少毫秒),这一切都发生在子例程中(在一个地方) .易于维护并保持您的主要代码干净。

您可以使用伪宏 (%stamp%) 而不是 call :stamp & echo Line to print(就像我所做的那样),但这取决于您。

虽然这不会给聚会带来任何新技术,根据已经提出的建议,我发布它是因为,我真的不认为有需要期待在同一行的响应。 (我们不会在在线聊天或消息应用程序中这样做)。因此,我们的想法是仅将 Echo 用于叙述/问题,(因此没有丢失 space) 的问题,并为最终用户提供新的他们的 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.

我意识到这是一个老问题,但我最初会生成一个自定义时间戳,然后将其传递给一个变量,以便我们可以根据需要重新使用。

注意:出于个人喜好,我选择了 12 小时时间格式并隐藏了秒数(可以通过简单地添加 %sec%).另外我还添加了 am/pm.

此外,如果您想将前导 0 重新添加到小时,那么您需要做的就是删除以下代码段:

for /f "tokens=* delims=0" %%N in ("%hour%") do set "hour=%%N"

这是有意分开的,以便在不需要时可以轻松移除。

所以,(包括 Compo 相当不错的补充)请看下面:

mode con: cols=65 lines=20  & color f0

::Get time and format
For /f "tokens=1,2,3 delims=:,. " %%A in ('echo %time%') do (
set /a "hour=100%%A%%100"
set min=%%B
set sec=%%C
)

::Add AM/PM to time
if %Hour% geq 12 (
set ampm=pm
set /a "hour-=12"
) else set "ampm=am"
if %hour% equ 0 set "hour=12"
if %hour% lss 10 set "hour=0%hour%"

:: Remove leading 0 from %hour%
for /f "tokens=* delims=0" %%N in ("%hour%") do set "hour=%%N"

::Setup time stamp
set "mytime=%hour%:%min%%ampm% -"

for /F %%G In ('"Prompt $H&For %%H In (1)Do Rem"')Do Set "input=%%G       > "
echo %mytime% Hello world!
echo %mytime% It's a sunny day outside.
echo %mytime% How are you?
set /P "state=%input%"
echo %mytime% That's great!
echo %mytime% You are %state%.

echo. &echo. Press any key to exit. &>nul timeout /t -1 &exit /B