延迟环境变量扩展(bat)
之前遇到一些环境变量的问题,简单记录下
From:http://www.cnblogs.com/dongzhiquan/archive/2012/09/05/2671218.html
%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)的更多相关文章
- dos中的延迟环境变量扩展
一.前言 昨天在写bat脚本的时候,发现在for里面的set命令竟然不起作用!于是搜了一下,前面的几篇都有说到这个是变量扩展的问题,但是什么是变量扩展?为什么会出现这种问题,什么又是延迟环境变量扩展? ...
- 关于CMD中延迟环境变量嵌套的实现方法
在我昨天做的一个bat中(自动按日期重命名文件名)涉及到这方面的问题 以前涉及到这里时就想别的办法替代过去,今天好好扒出来说说: 实现变量嵌套的2种方法: 1,使用call实现变量嵌套 变量嵌套:即在 ...
- Python中调用设置环境变量的bat
工作中用到一个python脚本,自动化运行某目录下的多个vc工程代码. 编译工程代码的命令如下,直接运行会失败,系统找不到devenv,我们需要添加devenv.exe所在的目录到环境变量中. os. ...
- python学习之flask接口开发,环境变量扩展,网络编程requests
python基础 flask之mock接口 所谓mock接口,其实就是我们在正式接口还没联调或者是测试接口没有正式使用时,自己创建一个模拟接口,来供项目暂时打通功能或者测试流程梳理的桥梁,而我们这儿使 ...
- [No0000111]java9环境变量配置bat
保存成bat(utf-8 无签名 编码) 右键以管理员权限运行 修改JAVAINSTALLPATH 为JAVA SDK 安装目录(默认用C:\PROGRAM FILES\JAVA\)即可: 只在 用户 ...
- bat-使用bat安装jdk和配置环境变量
文件路径 @echo off Setlocal enabledelayedexpansion @REM vscode中自动开启延迟环境变量扩展, %~d0 cd %~dp0 @REM dir echo ...
- bat-静默安装winrar并设置系统级环境变量
@echo off Setlocal enabledelayedexpansion @REM vscode中自动开启延迟环境变量扩展 echo 安装winrar "winrar v.5.71 ...
- bat-配置环境变量2-给PATH追加环境变量
使用setx /M path "%path%;%%winrar%%"这种方式修改环境变量存在的问题 对于 path 这种 既有用户级变量和系统级变量的变量 直接使用setx /M ...
- Windows下环境变量显示、设置或删除操作详情
显示.设置或删除 cmd.exe 环境变量. SET [variable=[string]] variable 指定环境变量名. string 指定要指派给变量的一系列字符串. 要显示当前环境变量,键 ...
随机推荐
- 高性能流媒体服务器EasyDSS前端重构(一)-从零开始搭建 webpack + vue + AdminLTE 多页面脚手架
本文围绕着实现EasyDSS高性能流媒体服务器的前端框架来展开的,具体EasyDSS的相关信息可在:www.easydss.com 找到! EasyDSS 高性能流媒体服务器前端架构概述 EasyDS ...
- oracle导入TXT文件
oracle导入TXT文件: 1.建好对应的表和字段:2.新建test.ctl文件,用记事本编辑写入: OPTIONS (skip) load data INFILE 'E:\8080.txt' -- ...
- openresty跑定时任务配置、ngx.timer.every接口使用
openresty的定时任务是要跟worker绑定的.如果不绑定特定的worker,那么所有启动的woker都会去执行定时任务. 一般情况下默认绑定worker_id=0的,这样在nginx整个进程里 ...
- 关于编译openjdk过程的一个编码错误
-Xlint:deprecation 重新编译 或者 错误: 编码ascii的不可映射字符 出现这种错误的时候 可以进行设置jdk编译编码即可解决 因为是编译openjdk 所以在环境变量中设置: ...
- HttpRunner 参数化数据驱动
HttpRunner 2.0 参数化数据驱动案例,废话不说,直接上干货. 1.测试用例目录结构 api:接口集 testcases:测试用例 testsuites:测试套件 data: ...
- go-008-循环语句
一.循环语句[只有for] 1.基础结构: Go语言的For循环有3中形式,只有其中的一种使用分号. 和 C 语言的 for 一样: for init; condition; post { } 和 C ...
- cookie和session的自我介绍
Cookie是什么? cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是 ...
- 检查Linux服务器性能命令详解
如果你的Linux服务器突然负载暴增,如何在最短时间内找出Linux性能问题所在? 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmst ...
- Spark2.0机器学习系列之5:随机森林
概述 随机森林是决策树的组合算法,基础是决策树,关于决策树和Spark2.0中的代码设计可以参考本人另外一篇博客: http://www.cnblogs.com/itboys/p/8312894.ht ...
- SpringMVC的其他功能使用
一.SpringMVC支持在控制器的业务方法中写入参数作为传递过来的变量 @Controller @RequestMapping(value="/kaiye") public cl ...