• 延迟变量


    ---------siwuxie095

       

       

       

    命令:

    setlocal enabledelayedexpansion

       

    扩展本地环境变量延迟 延迟环境变量扩展

       

    set:设置; local:本地(环境变量)

    enable:能够; delayed:延迟; expansion:扩展

    setlocal enabledelayedexpansion 扩展本地环境变量延迟 或 延迟环境变量扩展

       

    复合语句:一对括号()里的所有命令〔即便只有一条命令〕是复合语句;通过管道命令 &

    &&||| 连接起来的命令也是复合语句

       

       

    使用了 setlocal enabledelayedexpansion 后,

    如果在复合语句外引用变量,则使用 %var%!var! 都可以

       

    如果在复合语句中引用复合语句即时得到的变量,则必须使用 !var!

    在复合语句中还使用 %var%,那么得到的变量将是复合语句之前 var 的值,

    此时如果 var 在复合语句之前没有定义,那么值为空值

       

    如:

    @echo off

    set a=4

    set a=5 & echo %a%

    pause

       

    sublime中:

       

       

    运行一览:输出为 4 而不是 5

       

       

       

    批处理读取命令时是按行读取,在处理之前要完成必要的预处理工作,其中就包括

    对该命令行中的变量赋值,在运行到 set a=5 & echo %a% 之前,先把这一句整句读取

    并做预处理,对变量 a 赋值,那么 %a% 就是 4

       

    解决方法:批处理变量延迟

    如:

    @echo off

    setlocal enabledelayedexpansion

    set a=4

    set a=5 & echo !a!

    pause

       

    sublime中:

       

       

    运行一览:

       

       

       

    如果不用延迟变量:

    @echo off

    set a=4

    set a=5

    echo %a%

    pause

       

    sublime中:

       

    效果也是一样,都会输出 5

       

    但实际上,延迟变量不是可有可无的,某些情况下(如:在复合语句中),

    没有延迟变量,程序就无法正确运行

       

       

       

    复合语句下:

    如:

    @echo off

    setlocal enabledelayedexpansion

    set num=100

    for /l %%i in (1,1,%num%) do (set S%%i=1)

    for /l %%i in (1,1,%num%) do (echo !S%%i!)

    pause

       

    sublime中:

       

       

    运行一览:输出100 1

       

    这里的(echo !S%%i!),虽然只有一句,但依然是复合语句,只有用 !S%%i!

    才能回显实时的数值

       

    若用 %S%%i%,全是空值,无法显示,如下:输出100个 ECHO 处于关闭状态

       

       

       

    再如:

    @echo off

    setlocal enabledelayedexpansion

    set abc=123 & echo !abc!

    pause

       

    sublime中:

       

       

    运行一览:

       

       

       

    这里 set abc=123 & echo !abc!,也是复合语句

       

       

    计算机无法实时获取复合语句内的变量,%var% 获取的是复合语句前变量的值,

    要想实时获取复合语句中变量的动态值,就要使用延迟变量,且符号为:!var!

       

    变量延迟的适用范围:

    在复合语句中,且要实时获得变量的动态值,就要使用延迟变量

       

       

       

    再如:

    @echo off

    rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1

    for /l %%i in (1 1 10) do (

    set var=%%i

    echo %var%

    )

    pause

       

    sublime中:

       

       

       

    运行一览:输出10个 ECHO 处于关闭状态

       

       

    如果set var=abc:

    @echo off

    set var=abc

    rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1

    for /l %%i in (1 1 10) do (

    set var=%%i

    echo %var%

    )

    pause

       

    sublime中:

       

       

    运行一览:

       

       

    如果:

    @echo off

    set var=abc

    rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1

    for /l %%i in (1 1 5) do (

    set var%%i=%%i

    echo %var%

    )

    echo %var1% %var2% %var3% %var4% %var5%

    pause

       

    sublime中:

       

       

    运行一览:

       

       

    这表明:在复合语句中,并不是没有给变量赋值,只是因为没有开启

    延迟变量,就没办法在复合语句中提取到它,要等复合语句运行完毕后

    才能提取到。

    即:在复合语句中提取变量值,变量值是复合语句前的值,等复合语句运行完毕后,

    此时可以正确提取变量在复合语句中所赋的值

       

       

    变量的两种表示方法:1%var% 2、!var!

    第一种是普通情况下的表示方法,第二种就是引用延迟的变量

       

    在开启延迟变量的情况下:在复合语句外,用哪种都可以;在复合语句中

    引用复合语句即时得到的变量,就要用第二种方法

       

    如:

    @echo off

    setlocal enabledelayedexpansion

    set var=abc

    rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1

    for /l %%i in (1 1 5) do ( set var%%i=%%i )

    echo %var1% %var2% %var3% %var4% %var5%

    echo !var1! !var2! !var3! !var4! !var5!

    pause

       

    sublime中:

       

       

    运行一览:

       

       

       

    再如:

    @echo off

    setlocal enabledelayedexpansion

    set var=abc

    rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1

    for /l %%i in (1 1 10) do (

    set var=%%i

    echo %var%

    echo !var!

    )

    pause

       

       

    sublime中:

       

       

    运行一览:

       

       

       

       

       

       

    延迟变量实际应用:

    如:读入一个起始数字和一个终止数字,连续输出从起始数

    字到终止数字之间的所有数字,数字与数字之间要有空格

    @echo off

    setlocal enabledelayedexpansion

    set /p beg=请输入起始数字

    set /p end=请输入最终数字

    echo.

    rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1

    for /l %%i in (%beg%,1,%end%) do (

    set num= %%i

    rem <nul 前面加个空格 每个数字和数字间就会有空格

    set /p var=!num:~-7! <nul

    set /a var=%%i%%10

    if !var!==0 echo.

    )

    pause>nul

       

    sublime中:

       

       

    运行一览:

       

       

       

       

    批处理中,call命令也可以用来延迟变量

    如:

    @echo off

    set num=1

    set num=2 & call echo %%num%%

    pause

       

    sublime中:

       

       

    运行一览:

       

       

    可见:

    使用 setlocal enabledelayedexpansion 来延迟变量,

    变量符号改为感叹号(英文格式下)

       

    使用 call 来延迟变量,就要在原来的命令前加 call,并

    把变量引用的单层百分号改为双层百分号(繁琐,使用较少)

       

       

    【made by siwuxie095】

  • 相关阅读:
    线性回归(Linear Regression)的理解及原理
    3个模型搞清楚用户留存分析
    机器学习简单介绍
    数据分析经典方法:5W2H分析法
    使用guava RateLimiter限流
    Maven之assembly自定义打包
    IDE自动编译
    神奇的$scope
    二分法查找
    深入理解CSS选择器优先级
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6344920.html
Copyright © 2020-2023  润新知