如何在批处理文件中创建依赖于其他变量(如%time%date%)的变量?

时间:2018-08-17 11:03:27

标签: batch-file cmd

让我们说如果我必须将时间和日期打印三遍,我必须写

echo %date% %time%
echo %date% %time%
echo %date% %time%

上面的代码打印了3次不同的时间,如果我将%date%%time%分配给一个变量(以避免每次都写它们),那么它将打印3次恒定值,

set a=%date%_%time%
echo %a%
echo %a%
echo %a%

但是,我只想创建一次%a%变量,并且仍然在其更改时回显实际的日期和时间。

4 个答案:

答案 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