在批处理中用 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
我希望批量为每个 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