代码之家  ›  专栏  ›  技术社区  ›  Sean Sexton

DOS.bat文件中的意外变量subst行为

  •  0
  • Sean Sexton  · 技术社区  · 17 年前

    代码是,

    set VAR=before
    
    if "%VAR%" == "before" (
    
      set VAR=after;
    
      echo %VAR%
    
    )
    

    前面的Windows.bat文件代码段将显示什么?为什么?(即为什么它的行为不像你最初想象的那样)?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Ross Ridge    6 年前

    显然,考虑到我们在循环中重置了env变量,您会认为输出将是“after”。

    但实际输出将是“之前”。原因是,变量替换是在读取命令时由解释器在.bat文件中完成的,而不是在执行命令时。因此,对于复合语句,当首次遇到if语句时,会计算主体中的变量。

    您可以通过使用延迟环境变量扩展(需要启用它)来实现这一点。如果已启用,则可以执行以下操作:

    set VAR=before
    
    if "%VAR%" == "before" (
    
      set VAR=after;
    
      echo !VAR!
    
    )
    

    启动cmd.exe时,可以使用/v选项启用延迟环境变量扩展。

    [背景故事——我们中的许多人仍然使用传统的.bat文件来驱动make过程等。显然,有更好的脚本工具,但并不总是可以使用它们。不久前,我遇到了这个问题,最近又发现另外两个人因为同样的事情而拔了头发。因此,了解解释器如何进行变量替换是有用的。

        2
  •  0
  •   TAbdiukov miltonb    6 年前

    替代品 %VAR% 发生在命令执行之前。尽管有几个命令分布在几行中,但它们的分组是并行的 (...) 使cmd.exe解析器将整个内容作为单个命令读取。因此,在解释器看来,执行的内容如下。

    set VAR=before
    
    if "before" == "before" (
    
    set VAR=after;
    
    echo before
    
    )
    

    这是使批处理文件处理变得相当痛苦的许多事情之一,而不仅仅是简单的事情。

    推荐文章