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

Windows 在批处理中为每个回波加上带前导零的hh:mm:ss时间戳,windows,batch-file,time,cmd,leading-zero,Windows,Batch File,Time,Cmd,Leading Zero,我想用hh:mm:ss批量为每个echo添加时间戳。我一直在使用%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:~

我想用
hh:mm:ss
批量为每个
echo
添加时间戳。我一直在使用
%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%
组合起来?那会帮我解决问题的


或者强制
设置/p
不省略空格字符?这也行。

我会创建一个时间戳变量,如下所示:

set ts=%time: =0%
并将其用于文件中的所有时间戳


该语法将所有空格替换为0,我将创建一个时间戳变量,如下所示:

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

:: 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%: "
优点是:当有更多的任务要做时(这里:用
0
替换空格并缩短毫秒),所有这些都发生在子例程中(在一个位置)。易于维护并保持主代码干净


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

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

@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%: "
优点是:当有更多的任务要做时(这里:用
0
替换空格并缩短毫秒),所有这些都发生在子例程中(在一个位置)。易于维护并保持主代码干净


您可以使用伪宏(
%stamp%
)来代替
调用:stamp&echo Line打印
),但这取决于您。

虽然这并没有给聚会带来任何新技术,但除了已经提出的建议,我发布它是因为,我真的不认为有必要期待同样的回应。(我们不会在在线聊天或短信应用中这样做)。因此,我们的想法是只对叙述/问题使用
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.

虽然这并没有给聚会带来任何新的技巧,但是在已经提出的建议之外,我已经发布了它,因为我真的认为没有必要期待同样的回应。(我们不会在在线聊天或短信应用中这样做)。因此,我们的想法是只对叙述/问题使用
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/P
修剪前导空格,但您可以在字符串开头使用
.
+backspace作为一种变通方法…
set/P
修剪前导空格,但您可以在字符串开头使用
.
+backspace作为变通方法…这很有趣,也可以接受!我还是想看看是否有人知道如何在单个变量上组合子字符串提取和子字符串替换。@eqagunn,子字符串扩展和子字符串替换不能一次完成,你必须一个接一个地完成;当您使用延迟扩展时,您可以在一行中完成它们(使用
&
)。@aschipfl
set t=%time:~0,-3%&echo!t:=0谢谢!这是有趣的和可接受的!我还是想看看是否有人知道如何在单个变量上组合子字符串提取和子字符串替换。@eqagunn,子字符串扩展和子字符串替换不能一次完成,你必须一个接一个地完成;当您使用延迟扩展时,您可以在一行中完成它们(使用
&
)。@aschipfl
set t=%time:~0,-3%&echo!t:=0谢谢!试图将我的脚本排除在子程序之外,尽管我可以将这个脚本压缩进去。谢谢试图将我的脚本排除在子程序之外,尽管我可以将这个脚本压缩进去。谢谢