使用 hh:mm:ss 批量为前导零为每个回声添加时间戳



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

例:

@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不要省略空格字符?那也行得通。

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

@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%((就像我一样(,但这取决于您。

您可以通过捕获变量的退格来使用一些技巧。

@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用于叙述/问题(因此不会丢失空格(,并为最终用户提供新行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.

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

set ts=%time: =0%

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

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

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

注意:出于个人喜好,我选择采用 12 小时时间格式并隐藏秒数(只需添加%sec%即可再次包含秒数(。此外,我还添加了上午/下午

此外,如果要将前导 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

最新更新