我知道,如果没有延迟扩展,则在解析引用该变量的命令时,该变量的内容将替换为该变量。
我的问题是,如果一个命令多次引用一个变量会发生什么?
假设一个命令引用 %date% 变量三次,那么解析机制会三次检索日期,还是只检索一次(然后将其插入到行中出现的任何位置?
我开始思考这个问题,因为我用了
set var=%date:~6%-%date:~3,2%-%date:~0,2%
获取我喜欢的格式的日期。(基本上,它采用原始 dd/mm/yyyy 格式的日期,并将其重新组织为 yyyy-mm-dd)
但后来我想到了一个假设的可能性:如果我在 2022 年 3 月 31 日午夜前 1 毫秒调用此命令会怎么样?如果解析机制每次遇到日期时都检索最新的日期,那么从理论上讲,午夜是否可能到来?期间解析?那么,我得到的不是“2022-03-31”或“2022-04-01”的输出,而是“2022-03-01”?
答案1
其实我已经找到答案了。解析机制确实会不断重新引用变量。
哦,好吧,我希望该变量只被检索一次,然后在命令块中出现的任何位置替换它。
我用下面的代码演示了这一点。
@echo off
if exist C:\ (
set var1=%time%
echo %time%
echo %time%
[...]
echo %time%
echo %time%
set var2=%time%
)
echo start %var1%
echo end %var2%
timeout /nobreak -1
(中间我省略了大约一千行“echo %time%”)
开始和结束时间相差 0.01。
看起来我要将日期格式转换器更改为:
set frozen_date=%date%
set var=%frozen_date:~6%-%frozen_date:~3,2%-%frozen_date:~0,2%