由batch 命令setlocal enabledelayedexpansion引发的
预告:先来一段长长的唠叨!
作为一名比较能折腾的初级程序员,对一切都充满了好奇心,强迫症是个比较流行的词,我想我也应该是中毒份子吧。
这几天在公司折腾环境,一直用的是ubuntu,很好很强大,但是用上两个显示屏后就变得特别慢(绝对无法忍受),ubuntu10.10后一直采用的事unity桌面,后来在google上发现原来是个bug(https://bugs.launchpad.net/ubuntu/+source/unity/+bug/769650),无奈,解决方案也不好,于是转向gnome,gnome3我不喜欢,感觉不方便,ubuntu10.04采用的gnome2才是王道,google后发现gnome2这个项目已经死了(呜呜~~),不过开源世界总是有你想不到的,一个新的项目mate继续开发gnome2,很happy,安装方式也很简单,见http://wiki.mate-desktop.org/download。晒一下
左面写程序,右面看文档,爽多了!
---------------------------------------------很高兴你能看到华丽的分割线,下面进入正题--------------------------------------------------------------------------------------------------------------------------
在电脑变快之后,装上了vb,然后想装个绿色版qq,网上JayXon的应该是最普及的,他这里面有个bat文件,以前也没想着去打开看看,今天突发奇想打开看了看,发现是个很神奇(其实是micorsoft比较笨吧)的代码:
SetLocal EnableDelayedExpansion
网上发现这叫 延迟环境变量扩展,很奇怪的名字,这是什么回事呢,google一番后发现是这么回事:
batch文件在执行时,解释器会把先把一整条命令读入,然后分析语法是否正确,这在单句是没有任何问题的,但是bat文件中的if、for等这些符合语句(符合也算一个语句)就有问题了,下面我一一以代码演示之。下面的代码写在C:\hello.bat文件中,读者可以copy自行实践之。
@echo off
set foo="helloworld"
echo %foo%
上面是很简单的单句赋值情况,程序能够程序正确输出helloworld
下面看看如果是if语句会怎么样呢?
@echo off
set foo="helloworld"
if %foo%=="helloworld" (set foo="helloubuntu"echo %foo%
)
这时程序会输出什么呢?不了解batch文件的人肯定说是helloubuntu了,但是事实却还是helloworld,这是为什么呢?
现在我请你换下身份,以batch解释器而不是程序员的思路来看这个脚本到底是怎么执行的:
1.首先,解释器看到if后知道这条语句是个符合语句,那么他会读取一个完整句子后在进行后面的语法验证、执行(读整个句子时并不执行)等操作
2.读完整个句子后,解释器会进行一项变量扩展(也就是我们熟知的变量替换)的工作,batch特有的语法是两个%之间的变量(上面的%foo%就是)会被替换
3.完成替换工作后,解释器开始执行这个整句。
在上面3个过程后,解释器看到的是这样的代码:
@echo off
set foo="helloworld"
if %foo%=="helloworld" (set foo="helloubuntu"echo "helloworld"
)
所以,这么一看,输出helloworld一点也不奇怪了。
为了加深大家的理解,我在给一个for的例子
@echo off
for /L %%i in (1,1,10) do (set foo=%%iecho %foo%
)
这会输入什么呢,看看结果
为什么会这样呢?读者可以试着吧编译器看到的结果自己写出来,其实也很简单
@echo off
for /L %%i in (1,1,10) do (set test=%%iecho
)
就是这样的嘛,那么为什么会是上面的信息呢,这里你需要了解echo命令的用法,如果你只输入一个echo,后面不跟任何参数,那么将输出echo的状态
通过echo的帮助文档我们可以很清楚的了解,同时对于batch能够识别的命令都能够用类似的语法获得
因为我们第一行的@echo off将echo的状态给关闭了,所以输入了如上的信息。
到现在位置我们已经知道了batch解释器在解释符合语句时的问题了,那么微软时如何解决的呢,其实我们自己想想也很好相出办法解决,你一行行的读入不就行了嘛,干嘛非要读入符合语句的整句。其实微软也是这么做的,这就是本文标题命令的由来了,不过这是为了要用!变量名!的形式来引用了。
我们这次把上面的两个例子加上setlocal enabledelayedexpansion再试试看:
首先是if的情况
@echo off
setlocal enabledelayedexpansion
set foo="helloworld"
if %foo%=="helloworld" (set foo="helloubuntu"echo !foo!
)
for的那个例子:
@echo off
setlocal enabledelayedexpansion
for /L %%i in (1,1,10) do (set foo=%%iecho !foo!
)
结果和我们预想的一样了。
由batch 命令setlocal enabledelayedexpansion引发的相关推荐
- windows脚本Dos- cmd ,batch 命令
一.DOS,CMD和batch DOS是磁盘操作系统(英文:Disk Operating System)的缩写,是个人计算机上的一类操作系统.从1981年直到1995年的15年间,DOS在IBM PC ...
- 批处理中setlocal enabledelayedexpansion
批处理中setlocal enabledelayedexpansion的作用详细整理 设置本地为延迟扩展.其实也就是:延迟变量,全称延迟环境变量扩展, 想进阶,变量延迟是必过的一关!所以这一部分希望你 ...
- 批处理中setlocal enabledelayedexpansion的作用详细整理
设置本地为延迟扩展.其实也就是:延迟变量,全称延迟环境变量扩展, 想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看. 为了更好的说明问题,我们先引入一个例子. 例1: @echo off se ...
- 【Linux】一步一步学Linux——batch命令(134)
00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 batch命令用于在指定时间,当系统不繁忙时执行任务,用法 ...
- CMake编译VS工程,生成解决方案时遇到错误:error MSB3073: 命令“setlocal”
一.问题描述 CMake编译ZXing-cpp,编译成功后,打开项目,x86(win32)平台生成解决方案成功,但在x64平台,debug模式下报错:error MSB3073: 命令"se ...
- error MSB3073: 命令“setlocal
error MSB3073 是 Visual Studio 中的错误代码,它表示在执行命令时出现了问题. "setlocal" 是一条命令,用于将当前环境设置为本地范围.它通常用于 ...
- 一些常用的batch命令
最新工作中,需要编写一引起脚本文件,主要是为方便大家使用,尽量做到最简单的一键操作的功能.经过各种调试后,终于完成了功能,并且初步达到了当初的设想. 把最常用到的指令贴上来,方便以后需要时,能找到,也 ...
- .bat批处理命令的介绍
HUC = = D组 http://www.cnhonkerarmy.com/ 63707869 =====================================开始============ ...
- 批处理常用命令总结和WindowsXP下运行命令使用大全及优化
关于批处理以及批处理常用命令的总结 [ 一.什么是批处理 ] 批处理文件图标 批处理(Batch),也称为批处理脚本.顾名思义,批处理就是对某对象进行批量的处理.批处理文件的扩展名为 bat . 目前 ...
- 关于批处理以及批处理常用命令的总结
关于批处理以及批处理常用命令的总结 [ 一.什么是批处理 ] 批处理文件图标 批处理(Batch),也称为批处理脚本.顾名思义,批处理就是对某对象进行批量的处理.批处理文件的扩展名为 bat . 目前 ...
最新文章
- CAN 多于8字节的拆包组包协议
- 算法与数据结构——并查集
- PyTorch 1.8 发布,支持 AMD,优化大规模训练
- win7误删计算机,Win7系统下文件数据被误删了怎么办
- 查看80端口连接状态
- Linux OpenSSH后门的添加与防范
- 翼虎AE教程 Max贴图教程 地址备份。。。。
- delphi 7无法运行提示 Borland license information was found, but it is not valid for Delphi
- (附源码)计算机毕业设计SSM音乐鉴赏网站前端开发
- 在无外网虚拟机CentOS7下安装金山wps-office最新版(超详细小白教程)
- 六兆年と一夜物語 jzoj3501 最短路
- 清华大学镜像站miniconda下载地址
- 推荐一个免费且超快的 MDK 资源下载链接
- pytorch实现 chatbot聊天机器人
- Windows 11 版本介绍
- PON系统向单波速率25G演进
- 软件测试丨Git分支管理实操,搞定在线合并和本地合并
- 我来讲述计算机的知识,计算机基础知识讲述.doc
- 洛谷 1875 佳佳的魔法药水
- 1309 【例1.6】回文数(Noip1999)
热门文章
- win7计算机系统更新,win7电脑版本低怎么升级?win7电脑版本低的解决方法
- tcga数据下载_TCGA突变数据的下载、整理和可视化
- python如何期货交易_基于Python的股指期货交易系统
- 提高github下载速度的方法
- TVS和ESD的区别
- 如何用计算机术语写论文,计算机毕业论文结论怎么写?
- csgo服务器搭建 linux,Centos 搭建 CSGO KZ 服务器
- pt100热电阻计算公式C语言,牛顿法在Pt100铂热电阻温度计算中的应用特性分析
- ancestor descendant选择器
- temp不停生成临时文件 win10_桌面出现temp文件夹|桌面出现大量临时文件|win10桌面temp文件夹是什么...