让我们说如果我必须将时间和日期打印三遍,我必须写
echo %date% %time%
echo %date% %time%
echo %date% %time%
上面的代码打印了3次不同的时间,如果我将%date%%time%分配给一个变量(以避免每次都写它们),那么它将打印3次恒定值,
set a=%date%_%time%
echo %a%
echo %a%
echo %a%
但是,我只想创建一次%a%
变量,并且仍然在其更改时回显实际的日期和时间。
答案 0 :(得分:5)
delayed expansion是可能的:
@echo off
setlocal enabledelayedexpansion
set "a=^!time^!"
echo %a%
timeout 2 >nul
echo %a%
call
通常用于第二层解析,以避免延迟扩展(例如在aschipfl's answer中使用),但为了与其他任何变量完全一样使用延迟扩展,是唯一的方法
如果由于某种原因必须禁用延迟扩展或希望它直接在命令行上运行,则call
方法是一个不错的选择,当您不介意键入附加的{{1} }命令。
答案 1 :(得分:2)
在批处理文件中怎么办?
set "a=%%date%% %%time%%"
call echo %a%
> nul timeout 1
call echo %a%
> nul timeout 1
call echo %a%
在命令提示符下,它看起来像这样:
>>> set "a=%^date% %^time%"
>>> call echo %a%
>>> call echo %a%
>>> call echo %a%
答案 2 :(得分:1)
我假设您想一次set a
,但仍然显示日期和时间的实际变化?
@echo off
setlocal enabledelayedexpansion
for %%i in (1,1,3) do (
set a=!date!_!time!
timeout /t 1 > nul
echo !a!
)
我已经使用超时来简单地显示时间差,因为它运行得如此之快,它将显示与毫秒内运行的相同时间。
或者,调用标签:
@echo off
for %%i in (1,1,3) do (
call :timeloop
)
goto :eof
:timeloop
set a=%date%_%time%
timeout /t 1 > nul
echo %a%
您也可以将标签称为“不循环”:
@echo off
echo do something
call :timeloop
echo do something else
call :timeloop
goto :eof
:timeloop
set a=%date%_%time%
timeout /t 1 > nul
echo %a%
答案 3 :(得分:1)
您可以使用它作为替代:
@echo off
call :printdate
REM here I wait 2 seconds to test different timestamp values
timeout 2 1>NUL
call :printdate
pause
exit /B 0
:printdate
echo The timestamp is: %DATE%-%TIME%
goto :eof
输出:
The timestamp is: 17/08/2018-13:40:10,37
The timestamp is: 17/08/2018-13:40:12,16
如果您想传递参数,请使用以下命令:
@echo off
call :printdate "The OLD timestamp is: "
REM here I wait 2 seconds to test different timestamp values
timeout 2 1>NUL
call :printdate "The NEW timestamp is: "
pause
exit /B 0
:printdate
echo %~1 %DATE%-%TIME%
goto :eof
输出:
The OLD timestamp is: 17/08/2018-13:54:46,24
The NEW timestamp is: 17/08/2018-13:54:48,14