批处理文件命令中同一变量的多个实例的变量扩展如何工作?

批处理文件命令中同一变量的多个实例的变量扩展如何工作?

我知道,如果没有延迟扩展,则在解析引用该变量的命令时,该变量的内容将替换为该变量。

我的问题是,如果一个命令多次引用一个变量会发生什么?

假设一个命令引用 %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%

相关内容