• 延迟环境变量扩展


    延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展

    CMD在解释我们的命令的时候,首先会读取命令行一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输入的命令格式是不是符合他的要求.

    如果我们要在我们的命令中引用一些变量,那么我们如何让CMD在解释我们的命令时,能识别出这个变量呢?这时我们就可以在变量名字两边加一个%,%name%.CMD在对读取我们的整行

    命令进行格式匹配的时候,就会发现name这个字符两边加了%,就不会把他当作普通字符处理,而是会把他当作一个变量处理,变量名叫name!然后CMD就会找到变量名对应的值,用变量名的值替换掉这个变量名字(name),(如果变量名不存在值,就返回空值).再将这个替换好并且匹配的命令执行!这个替换值的过程,就叫做变量扩展,说白了就是把变量的名字,用他的值给替换掉后执行!也就是批处理如何识别一个变量的过程.

    注意:这里只是变量的扩展的意思,不是延迟环境变量扩展,要理解延迟环境变量扩展,必须先理解什么是变量的扩展,也就是批处理如何识别一个变量的过程.

    变量扩展

    如:

    @echo off
    set test=123
    set var=%test%
    echo %var%
    pause

    CMD在读取到echo %var%这句命令后,就会进行匹配操作,它马上就发现var字符两边有%,这时他就会把他当作一个变量处理,查看这个var变量名是不是有值,如果有就用他的值把变量名var给替换掉,这里我们的VAR在上一条命令set var=%test%,var赋值为%test%,所以他会用test变量%var%这个变量名替换掉,替换后的结果就为echo %test%.这些步骤都是CMD进行匹配操作的步骤,匹配完后,他再执行echo %test%这条语句,这时它会发现test也是一个变量,就会继续网上找,把123替换过来,这时我们的CMD中就会echo出一个123.

    延迟环境变量扩展

    在理解环境变量扩展时,我们知道CMD在解释命令时,首先会把一条完整的命令进行读取,然后进行匹配操作,匹配时他会把命令里的变量用变量的值个替换掉,然后执行这个替换好的命令.

    问题就出在"一条完整的命令",BAT,IF FOR这样的命令都可以加括号,将一些命令嵌套在里面执行.这样的话对于一条可以加扩号嵌其他命令的命令,他的完整格式就是

    for %%i in (....)

    这样一个整体.此时,如果我们如果在括号里面嵌入一些设置变量值的命令,就会出现问题!

    1.嵌套命令的命令

    @echo off
    for /l %%i in (1,1,5) do (
        set var=%%i
        echo %var%
    )

    批处理过程中,

    这一段代码整个作为一个完整的命令来处理,当作一个整体,读取到内存中,然后进行预处理,此时的 set var=%%i 并不是做赋值处理 而是当作字符放入批处理,所以echo的时候 var 其实还是空值,所以打印的时候会报错。

    再看下面这个例子:

    @echo off
    set var=test     ::此时设置var的值
    for /l %%i in (1,1,5) do (
        set var=%%i  ::此时只是被当作字符进行匹配处理,不是设置值
        echo %var%  ::打印的还是for之前设置的值
    )    

    为了解决在for语句这类嵌套命令的命令中无法设置变量值的问题,所以提出了“延迟环境变量扩展”这个概念

    setloacl ENABLEDELAYEDEXPANSION 启用延迟环境变量扩展

    在我们启用了"延迟环境变量扩展",CMD在解释涵有嵌套格式的命令时,他会把嵌套的命令一条一条的先执行一次,然后再进行匹配操作,这样我们的赋值操作就会完成.并且再"延迟环境变量扩展"启用后,CMD会用!来判断这是不是一个变量,如没启用来变量用%name%这样的格式判断,启用后就用!name!这样的格式判断了,这个符号我们需要注意!

    @echo off
    setlocal ENABLEDELAYEDEXPANSION  ::启用延迟环境变量扩展
    set var=test
    for /l %%i in (1,1,5) do (
        set var=%%i   ::给var赋值    
        echo !var!        ::不再用%而是!来读取变量
    )
    pause    

    2.通过连接符执行的命令

    @echo off
    set var=test & echo %var%  ::此时整句作为预处理加载到内存,var并没有被赋值,还是个空值
    pause

    同样,此类问题我们也需要开启“延迟环境变量扩展”

    @echo off
    setlocal ENABLEDELAYEDEXPANSION
    set var=test & echo !var!
    pause

  • 相关阅读:
    【转】HTTP 状态码详解
    程序员自我提升之粗粮与细粮
    配置Eclipse支持MacBook Pro Retina屏幕的办法(解决Retina屏幕下eclipse字体变虚的问题)
    IE6下lineheight失效:当文字与图片img在同一行中显示时lineheight失效的解决办法
    2013年第二周的总结
    为什么这么多的云存储产品却没有一个能够统一管理它们的应用出现
    微软的云笔记:OneNote+SkyDrive
    完美的外出上网解决方案随身随地享用你的专有WIFI网络(3G无线路由器+sim卡卡托+3G资费卡)
    [转]如何才能更加有效率
    Perl Note
  • 原文地址:https://www.cnblogs.com/yifengs/p/16407707.html
Copyright © 2020-2023  润新知