变量延迟(下)

在这里,我们先来看看“变量扩展”有是怎么一回事。
  用CN-DOS里批处理达人willsort的原话,那就是:“在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion)”,这其实是一个第一方的概念,是从命令解释器的角度进行称谓的,而从我们使用者的角度来看,则可以将它看作是引用(Reference)、调用(Call)或者获取(Get)。”(见:什么情况下该使用变量延迟?http://www.cn-dos.net/forum/viewthread.php?tid=20733)说得直白一点,所谓的“变量扩展”,实际上就是很简单的这么一件事情:用具体的值去替换被引用的变量及紧贴在它左右的那对百分号。
既然只要延迟变量的扩展行为,就可以获得我们想要的结果,那么,具体的做法又是怎样的呢?
一般说来,延迟变量的扩展行为,可以有如下选择:
1、在适当位置使用setlocal enabledelayedexpansion语句;
2、在适当的位置使用call语句。
使用setlocal enabledelayedexpansion语句,那么,示例1和示例2可以分别修改为:
示例3
@echo off
setlocal enabledelayedexpansion
set num=0&&echo !num!
pause

示例4:
@echo off
set num=0
setlocal enabledelayedexpansion
for /f %%i in ('dir /a-d /b *.exe') do (
set /a num+=1
echo num当前的值是!num!
)
echo当前目录下共有%num%个exe文件
dir /a-d /b *.txt|findstr "test">nul&&(
echo存在含有test字符串的文本本件
)||echo不存在含有test字符串的文本文件
if exist test.ini (
echo存在test.ini文件
) else不存在test.ini文件
pause

使用第call语句,那么,示例1示例2可以分别修改为:

示例5:
@echo off
set num=0&&call echo %%num%%
pause

示例6
@echo off
set num=0
for /f %%i in ('dir /a-d /b *.exe') do (
set /a num+=1
call echo num当前的值是%%num%%
)
echo当前目录下共有%num%个exe文件
dir /a-d /b *.txt|findstr "test">nul&&(
echo存在含有test字符串的文本本件
)||echo不存在含有test字符串的文本文件
if exist test.ini (
echo存在test.ini文件
) else不存在test.ini文件
pause

  由此可见,如果使用setlocal enabledelayedexpansion语句来延迟变量,就要把原本使用百分号对闭合的变量引用改为使用感叹号对来闭合;如果使用call语句,就要在原来命令的前部加上call命令,并把变量引用的单层百分号对改为双层。其中,因为call语句使用的是双层百分号对,容易使人犯迷糊,所以用得较少,常用的是使用setlocal enabledelayedexpansion语句(set是设置的意思,local是本地的意思,enable是能够的意思,delayed是延迟的意思,expansion是扩展的意思,合起来,就是:让变量成为局部变量,并延迟它的扩展行为)。

总结:
  1、
为什么要使用变量延迟?因为要让复合语句内部的变量实时感知到变量值的变化。
  2、在哪些场合需要使用变量延迟语句在复合语句内部,如果某个变量的值发生了改变,并且改变后的值需要在复合语句内部的其他地方被用到,那么,就需要使用变量延迟语句。而复合语句有:for语句、if……else语句、用连接符&、||和&&连接的语句、用管道符号|连接的语句,以及用括号括起来的、由多条语句组合而成的语句块。最常见的场合,则是for语句和if……else语句。
  3、怎样使用变量延迟
  方法有两种

  ①使用setlocal enabledelayedexpansion语句:在获取变化的变量值语句之前使用setlocal enabledelayedexpansion,并把原本使用百分号对闭合的变量引用改为使用感叹号对来闭合;
  ②使用call语句:在原来命令的前部加上call命令,并把变量引用的单层百分号对改为双层。
4、如何关闭变量延迟?使用setlocal disabledelayedexpansion可以关闭变量延迟。

:关于setlocal的更多内容请参照《Setlocal命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值