预告:先来一段长长的唠叨!

作为一名比较能折腾的初级程序员,对一切都充满了好奇心,强迫症是个比较流行的词,我想我也应该是中毒份子吧。

这几天在公司折腾环境,一直用的是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引发的相关推荐

  1. windows脚本Dos- cmd ,batch 命令

    一.DOS,CMD和batch DOS是磁盘操作系统(英文:Disk Operating System)的缩写,是个人计算机上的一类操作系统.从1981年直到1995年的15年间,DOS在IBM PC ...

  2. 批处理中setlocal enabledelayedexpansion

    批处理中setlocal enabledelayedexpansion的作用详细整理 设置本地为延迟扩展.其实也就是:延迟变量,全称延迟环境变量扩展, 想进阶,变量延迟是必过的一关!所以这一部分希望你 ...

  3. 批处理中setlocal enabledelayedexpansion的作用详细整理

    设置本地为延迟扩展.其实也就是:延迟变量,全称延迟环境变量扩展, 想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看. 为了更好的说明问题,我们先引入一个例子. 例1: @echo off se ...

  4. 【Linux】一步一步学Linux——batch命令(134)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 batch命令用于在指定时间,当系统不繁忙时执行任务,用法 ...

  5. CMake编译VS工程,生成解决方案时遇到错误:error MSB3073: 命令“setlocal”

    一.问题描述 CMake编译ZXing-cpp,编译成功后,打开项目,x86(win32)平台生成解决方案成功,但在x64平台,debug模式下报错:error MSB3073: 命令"se ...

  6. error MSB3073: 命令“setlocal

    error MSB3073 是 Visual Studio 中的错误代码,它表示在执行命令时出现了问题. "setlocal" 是一条命令,用于将当前环境设置为本地范围.它通常用于 ...

  7. 一些常用的batch命令

    最新工作中,需要编写一引起脚本文件,主要是为方便大家使用,尽量做到最简单的一键操作的功能.经过各种调试后,终于完成了功能,并且初步达到了当初的设想. 把最常用到的指令贴上来,方便以后需要时,能找到,也 ...

  8. .bat批处理命令的介绍

    HUC = = D组 http://www.cnhonkerarmy.com/ 63707869 =====================================开始============ ...

  9. 批处理常用命令总结和WindowsXP下运行命令使用大全及优化

    关于批处理以及批处理常用命令的总结 [ 一.什么是批处理 ] 批处理文件图标 批处理(Batch),也称为批处理脚本.顾名思义,批处理就是对某对象进行批量的处理.批处理文件的扩展名为 bat . 目前 ...

  10. 关于批处理以及批处理常用命令的总结

    关于批处理以及批处理常用命令的总结 [ 一.什么是批处理 ] 批处理文件图标 批处理(Batch),也称为批处理脚本.顾名思义,批处理就是对某对象进行批量的处理.批处理文件的扩展名为 bat . 目前 ...

最新文章

  1. CAN 多于8字节的拆包组包协议
  2. 算法与数据结构——并查集
  3. PyTorch 1.8 发布,支持 AMD,优化大规模训练
  4. win7误删计算机,Win7系统下文件数据被误删了怎么办
  5. 查看80端口连接状态
  6. Linux OpenSSH后门的添加与防范
  7. 翼虎AE教程 Max贴图教程 地址备份。。。。
  8. delphi 7无法运行提示 Borland license information was found, but it is not valid for Delphi
  9. (附源码)计算机毕业设计SSM音乐鉴赏网站前端开发
  10. 在无外网虚拟机CentOS7下安装金山wps-office最新版(超详细小白教程)
  11. 六兆年と一夜物語 jzoj3501 最短路
  12. 清华大学镜像站miniconda下载地址
  13. 推荐一个免费且超快的 MDK 资源下载链接
  14. pytorch实现 chatbot聊天机器人
  15. Windows 11 版本介绍
  16. PON系统向单波速率25G演进
  17. 软件测试丨Git分支管理实操,搞定在线合并和本地合并
  18. 我来讲述计算机的知识,计算机基础知识讲述.doc
  19. 洛谷 1875 佳佳的魔法药水
  20. 1309 【例1.6】回文数(Noip1999)

热门文章

  1. win7计算机系统更新,win7电脑版本低怎么升级?win7电脑版本低的解决方法
  2. tcga数据下载_TCGA突变数据的下载、整理和可视化
  3. python如何期货交易_基于Python的股指期货交易系统
  4. 提高github下载速度的方法
  5. TVS和ESD的区别
  6. 如何用计算机术语写论文,计算机毕业论文结论怎么写?
  7. csgo服务器搭建 linux,Centos 搭建 CSGO KZ 服务器
  8. pt100热电阻计算公式C语言,牛顿法在Pt100铂热电阻温度计算中的应用特性分析
  9. ancestor descendant选择器
  10. temp不停生成临时文件 win10_桌面出现temp文件夹|桌面出现大量临时文件|win10桌面temp文件夹是什么...