页首Html代码

关于CMD中延迟环境变量嵌套的实现方法

在我昨天做的一个bat中(自动按日期重命名文件名)涉及到这方面的问题

以前涉及到这里时就想别的办法替代过去,今天好好扒出来说说:

实现变量嵌套的2种方法:

1,使用call实现变量嵌套

量嵌套:即在变量中嵌套变量,将变量的值作为另外一个变量的名字(或一部分名字)

这种用法很多语言都支持,如PHP的$$p,如C语言的**p二级指针,但在BAT中这是第一次涉及

如:(需要通过a输入10)

set a=1&set b1=10
call,echo %%b%a%%%

call 这里实际是对命令行进行重新组织扩展,先扩展%%b%a%%%里面的%a%,使%a%变成a的值1,再用call来扩展%b1%

2,也可以通过延迟环境变量扩展(setlocal EnableDelayedExpansion)来实现

如: 

setlocal EnableDelayedExpansion
set a=1&set b1=10
echo !b%a%!
::也可以得到结果10 

使用CALL实现变量嵌套替换:

使用的环境变量替换用法,即%PATH:str1=str2%,用 "str2" 代替扩展结果中的每个 "str1"

而str1本身也是个变量,如果直接写成echo %a:%b%=%,得到的结果会发生错误

如:

set a=12347set b=2
echo %a:%b%=%

 

我们是想把从a里面删除b变量的内容,即从a中删除2,想得到结果134,但是实际执行结果为%a:2=%

系统先把%b%解释了出来,把得到结果再执行一次就是正确的我想要结果了,所以用到了call 

终于得到了正确的结果。(在bat文件中要双写外层百分号:echo %%a:%b%=%%)

实现延缓环境变量嵌套替换:

在上所述都是在这两个变量本身都可以直接使用%来输出值,而我的程序中涉及的变量不能使用%来输出,就麻烦了

我的程序里面本身就已经开启了延缓环境变量扩展,并且,

使用到的两个变量都必须使用“!变量!”双叹号才能使用,即涉及的两个变量都在for的复合语句中发生更改

所以不能使用!b%a%!或是%b!a!%的方法来实现,只能使用call了 

 

我的程序中涉及变量filesrc和datatime,需要把filesrc中所有datatime都删掉,并在最前面加上datatime

换言之就是让最终结果只有一个datatime的值

如果按照一般的写法,写成

set file=!datatime!-!filesrc:!datatime!-=!

会得到错误结果: 

 

从上面的实验得出的结论,(如果datatime为a)应该得到结果为“a-!filesrc:a-=!”,但是实际结果缺不是这样的。。。。。。。

我认识是叹号变量标识符配对错误。(而使用%就可以,从上述实验就可以看出来)

前面没事,后面会进行这样配对:!filesrc:!datatime!-=!

即寻找变量名为“filesrc:”和变量名为“-=”的值,都找不到,所以直接输出datatime

这句代码即使加上了call,依然不能解决问题

最终解决方案

经过反复实验最终解决方法是:

call set file=!datatime!-%%filesrc:!datatime!-=%%

测试:

 

实现了变量嵌套替换。

先将原始文件名中的datatime删除,再在前面加上datatime,而不是一味的累加,实现只有一个datatime)

但是从理论上来讲,filesrc在for中也发生变化,是不能使用%来标示变量的,但是使用call配合%%却没有任何错误

百思不得其解,只能先了解这么用好了

 

posted @ 2015-06-17 18:02  沧海月明FE  阅读(1439)  评论(0编辑  收藏  举报