注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

批处理中setlocal enabledelayedexpansion的作用  

2017-03-31 12:30:03|  分类: 操作系统 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
setlocal enabledelayedexpansion按照字面意义来说,就是设置本地为延迟扩展。这个解释可能让人看不懂,其实拆穿了:延迟变量,全称延迟环境变量扩展, 如果想玩一些进阶批处理,那么熟悉变量延迟就是必过的一关了!
好了,以上干巴巴的解释然并卵,下面就来实战一下。
用和不用会是个什么情况,可以用实例来说明:

@echo off
set a=593668.com
set a=237h.com&echo %a%
pause

执行结果如下:
批处理中setlocal enabledelayedexpansion的作用 - sinsunson - 天朝布衣田中码农参上
看了之后,是不是感觉有点怪异,明明把变量a设置成了237h.com,怎么最终显示的还是593668.com。这就要从批处理运行命令的机制说起:批处理读取命令时是按行读取的(例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。所以在执行到set a=237h.com&echo %a%这行时,是先对变量a做了预处理,让它等于593668.com。感觉有点怪,不要问WHY,批处理就这样。

@echo off&setlocal enabledelayedexpansion
set a=593668.com
set a=237h.com&echo !a!
pause

执行结果如下:
批处理中setlocal enabledelayedexpansion的作用 - sinsunson - 天朝布衣田中码农参上
为了能够感知环境变量的实时变化,批处理才设计了变量延迟。简单来说,在读取了一条完整的语句之后,不会立即对该行的变量赋值,只会在某个单条语句执行之前再进行赋值,也就是说,等同于“延迟”对变量的赋值,所以最终的结果才是237h.com。
请注意:变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意符号必须是半角,也就是要用英文的叹号),否则就没有变量延迟的效果。
而针对for语句,也可以察看下面一个例子【把当前目录中的jpg文件按10个一组分到不同的目录下】:

@echo off&setlocal enabledelayedexpansion
set m=1
(for %%a in (*.jpg) do (
set/a "n+=1,1/(10*m-n+1)"||(set/am+=1)
md !m!&move "%%a" .\!m!\
))2>nul

这里如果不想按10个一组,那么也可以修改,效果是非常好,大家可以试试看。
 
 
  评论这张
 
阅读(3)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017