zoukankan      html  css  js  c++  java
  • 关于bat中的称延迟环境变量扩展enabledelayedexpansion的理解

    关于bat中对延迟环境变量扩展setlocal enabledelayedexpansion的理解

    1、先看一个例子,如下默认情况下,会输出100

    set var1=100
    set var1=200&echo %var1%
    Rem 这里&为连接符,两边有无空格都是可以的,标准应有空格
    Rem 通过&连接的语句会被视为一行,这里替换成&&效果也是一样的
    Rem 但是如果在第三行,输出%var1%,则就会正常输出200了

    其实这是批处理脚本执行机制导致的,它会按行执行,在执行之前会先预处理

    当执行set var1=1000之后,变量var1变成了100,在执行set var1=200&echo %var1%之前先预处理,

    将变量%var1%替换成了100,即set var1=200&echo 100,所以就得到了我们上面测试的结果

    一般的一行,for, if的整句,&、&&、|| 等由连接符连接的整行,()圆扩符之间的代码,都被视为一句。

    bat读一句后先不会执行,而会预处理该句子,如检查代码是否合法,替换%%包含的变量,特殊符号的处理等。

    +++按理说单独写成一行,就可以解决上面的问题,但如果在for语句中呢,看如下例子,如下:

    set a=1
    for /l %%i in (1,2,3) do ( 
        set /a a=%a%+%%i
        echo %a% 
    )
    Rem 一般为了bat脚本的兼容性更好,for语句的循环体一般都是通过连接符写到一行的
    Rem 如上所讲,会将循环体内的视为一行先预先处理

    执行过程其实如下:

    再举一个例子,可能更容易说明问题,如下,默认情况下两次输出的随机数都将是一样的:

    for /l %%i in (1,2,3) do ( echo QQ520%random% )     
    Rem 两次都会出一样的,如输出QQ5201351

    要解决这个问题,可以开启延迟环境变量扩展setlocal enabledelayedexpansion,如下:

    setlocal enabledelayedexpansion
    for /l %%i in (1,2,3) do ( echo !random! )
    Rem 如果没有开启延迟环境变量扩展,!random!,就会被视为原样的字符串 Rem 如果开启了延迟环境变量扩展,对于变量就得使用
    !!包围起来,如果还是写成%var%还是会预先处理

    别:如果要setlocal enabledelayedexpansion只影响当前批处理文件执行时的范围

    如果脚本中临时关闭可以使用setlocal disabledelayedexpansion,

    还有笔者测试发现这语句在cmd中无实际影响,都是预先处理的,而且也不支持!var!的写法

    尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/13734416.html

  • 相关阅读:
    [读史思考] 田单火牛阵是真实的吗?
    Alink漫谈(十二) :在线学习算法FTRL 之 整体设计
    Alink漫谈(十一) :线性回归 之 L-BFGS优化
    [笔记整理] 一维搜索
    Alink漫谈(十) :线性回归实现 之 数据预处理
    [记录点滴]编译安装luarocks、luacheck、luautf8
    [源码解析]Oozie来龙去脉之内部执行
    [记录点滴]OpenResty 支持http v2的问题
    Alink漫谈(九) :特征工程 之 特征哈希/标准化缩放
    [记录点滴]Ionic编译过程的研究
  • 原文地址:https://www.cnblogs.com/5201351/p/13734416.html
Copyright © 2011-2022 走看看