%var%相当于宏变量直接将值换到命令中,然后执行。

!var!则是普通变量,每次可以直接读取内存中的值。

延迟变量全称\"延迟环境变量扩展\",要理解这个东西,我们还得先理解一下什么叫扩展!
    CMD在解释我们的命令的时候,首先会读取命令行一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输入的命令格式是不是符合他的要求.
如果我们要在我们的命令中引用一些变量,那么我们如何让CMD在解释我们的命令时,能识别出这个变量呢?这时我们就可以在变量名字两边加一个%号, 如%name%.当CMD在对读取我们的整行命令进行格式匹配的时候,就会发现name这个字符两边加了%号,就不会把他当作普通字符处理,而是会把他当 作一个变量处理,变量名叫name!然后CMD就会找到变量名对应的值,用变量名的值替换掉这个变量名字(name),(如果变量名不存在值,就返回空 值).再将这个替换好并且匹配的命令执行!这个替换值的过程,就叫做变量扩展,说白了就是把变量的名字,用他的值给替换掉后执行!也就是批处理如何识别一 个变量的过程.
(注意:这里只是变量的扩展的意思,不是延迟环境变量扩展,要理解延迟环境变量扩展,必须先理解什么是变量的扩展) 也就是批处理如何识别一个变量的过程.

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

什么是环境变量扩展知道了,那什么是延迟环境变量扩展呢?
在理解环境变量扩展时,我们知道CMD在解释命令时,首先会把一条完整的命令进行读取,然后进行匹配操作,匹配时他会把命令里的变量用变量的值个替换掉,然后执行这个替换好的命令.
问题就出在\"一条完整的命令\",在BAT中,IF FOR这样的命令都可以加括号,将一些命令嵌套在里面执行.这样的话对于一条可以加扩号嵌其他命令的命令,他的完整格式就是for %%i in (....)这样一个整体.此时,如果我们如果在括号里面嵌入一些设置变量值的命令,就会出现问题了!

看例子
     @echo off
     for /l %%i in (1,1,5) do (
       set var=%%i
       echo %var%
     )
     执行后会显示5个空行的错误提示!为什么?根据我们上面说的知识来理解

通过这两个例子,大家因该已经理解,如果只有环境变量扩展这个过程的话,如果我们在可以嵌套命令的命令中执行赋值操作时,会让我们的BAT出现给变量赋值的问题,即在命令执行之前变量便进行了替换,导致后没操作中对变量的任何修改都不能在当前批处理中体现出来.

那么这个时候\"延迟环境变量扩展\",这个概念就被提出来了,延迟环境变量扩展,即每条指令在执行之前才将变量进行替换,以保证对变量的任何修改都可以实时生效.
    在批处理中,我们可以用setloacl ENABLEDELAYEDEXPANSION这个命令来启用\"延迟环境变量扩展\"
在我们启用了\"延迟环境变量扩展\"后,当CMD在解释涵有嵌套格式的命令时,他会把嵌套的命令一条一条的先执行一次,然后再进行匹配操作,这样我们的 赋值操作就会完成.并且再\"延迟环境变量扩展\"启用后,CMD会用!号来判断这是不是一个变量,如没启用来变量用%name%这样的格式判断,启用后 就用!name!这样的格式判断了,这个符号我们需要注意!

例子:
     @echo off
     setlocal ENABLEDELAYEDEXPANSION
     set var=1
     for /l %%i in (1,1,5) do (
       set /a var+=%%i
       echo !var!
     )
    pause
这样大家因该明白什么是延迟环境变量扩展了吧.

再来一个例子
     @echo off
     set var=test & echo %test%
     pause
这条命令放在一行,表示他是一条完整的命令,不启用\"延迟环境变量扩展\",就会出现上面的赋值错误!
改成这样
     @echo off
     setlocal ENABLEDELAYEDEXPANSION
     set var=test & echo !var!
     pause.

@echo off
setlocal ENABLEDELAYEDEXPANSION
IF "%1"=="" (
echo "aaa"
) ELSE (
set hour=%1
set /a smallhour=hour-1
echo !hour!
echo !smallhour!
if "%time:~0,5%" geq "%smallhour%:45" if "%time:~0,5%" leq "%hour%:15" echo "aaa"
)

延迟环境变量扩展(bat)相关推荐

  1. 批处理命令 / 延迟环境变量扩展

    @time 2019-07-09 @author Ruo_Xiao 1.变量扩展 当写一个 bat 脚本时,解释器会读取命令行完整指令,若解释器发现指令里面有变量时,需要对变量进行替换,那么识别变量的 ...

  2. 批处理-延迟环境变量扩展

    延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展!CMD在解释我们的命令的时候,首先会读取命令行一条完整的命令,然后对其进行一些命令格式的匹配操作,看 ...

  3. 批处理注释格式,环境变量扩展

    rem echo off会关闭显示它以后的所有命令,"rem"注释格式1 @echo off set var=4 : 环境变量扩展就是用变量值去替代%var%的过程 ": ...

  4. [No0000111]java9环境变量配置bat

    保存成bat(utf-8 无签名 编码) 右键以管理员权限运行 修改JAVAINSTALLPATH 为JAVA SDK 安装目录(默认用C:\PROGRAM FILES\JAVA\)即可: 只在 用户 ...

  5. Linux 执行文件 path,linux可执行文件添加到PATH环境变量的方法

    linux命令行下面执行某个命令的时候,首先保证该命令是否存在,若存在,但输入命令的时候若仍提示:command not found 这个时候就的查看PATH环境变量的设置了,当前命令是否存在于PAT ...

  6. .bat文件(%~dp0)和call、echo批处理环境变量

    定义: .bat文件即batch,批处理文件 百度百科的定义:批处理(Batch),也称为批处理脚本.顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Win ...

  7. bat批处理命令大全_DOS使用环境变量图文教程,bat批处理脚本查看调用环境变量命令...

    大家好,我是老盖,首先感谢观看本文,本篇文章做的有视频,视频讲述的比较详细,也可以看我发布的视频. 今天我们学习在DOS和BAT批处理脚本中使用环境变量,环境变量是windows定义的一个变量,它有一 ...

  8. 批处理bat脚本自动配置java的jdk环境变量

    前言 每当更换电脑或者是重装系统之后,都需要重新配置java系统路径.但是又不想每次都去查配置方法,所以写了个脚本自动配置. 脚本内容 @echo off @echo 第一步 输入要设置的JAVA_H ...

  9. bat for 循环中定义变量(变量值不显示,通过使用「延期变量扩展」方式解决)

    ■前言 今天实现业务功能时,写了类似如下,第一个循环中的代码, @setlocal enabledelayedexpansion @echo off cd /d C:\test\temp\ tree ...

最新文章

  1. 0x42.数据结构进阶 - 树状数组
  2. linux引数列项目过长,Linux 命令个人总结====== 未完待续 个人认为比较重要
  3. ClickHouse 源码阅读 —— SQL的前世今生
  4. int(a) 和 (int ) a 及 数据存储地址的探究
  5. (62)FPGA面试题-用verilog写一段代码,实现消除一个glitch(毛刺)(一)
  6. Boring Game (10 分)
  7. R语言: 如何快速获取一个地方的气象数据?
  8. SPFA - Luogu 3385 【模板】负环
  9. Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系
  10. CSDN:数学公式编辑器
  11. 基于RV1126平台imx291分析
  12. Python 计算彩色图像信噪比
  13. [HDU - 3709] Balanced Number (数位dp)
  14. 空间划分的数据结构(网格/四叉树/八叉树/BSP树/k-d树/BVH/自定义划分)
  15. 【Rust日报】 2019-04-04
  16. aptx android8,支持aptxHD和LDAC!安卓8.0蓝牙音质大爆发
  17. Python程序设计 大作业 简化的PS
  18. python OGR库读取矢量文件——OGR shp操作
  19. 批量重命名 将中文名称翻译成英文名称的操作方法
  20. php+mysql 留言板系统 学生适用

热门文章

  1. Tensorflow—Fetch and Feed
  2. PyTorch之深入理解list、ModuleList和Sequential。
  3. 遗传算法应用(实例详细演示最小生成树的prufer编码和Cayley定理)
  4. 小数据,大前景 !美国智库最新报告:长期被忽略的小数据人工智能潜力不可估量...
  5. 国拨经费约31.48亿!科技部发布科技创新2030 —“脑科学与类脑研究”重大项目2021年度项目申报指南...
  6. 60颗卫星被五手火箭送上天!马斯克疯狂的卫星互联网计划不远了
  7. 2019年深度学习的十大预测
  8. 2018 中国开源年度报告发布,阿里系独占鳌头
  9. 利用HoloLens进行无人船舶驾驶!微软日本概念视频
  10. 辞退了一名 2 年工作经验的前端工程师