关于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配合%%却没有任何错误
百思不得其解,只能先了解这么用好了
如果您认为本文对得起您所阅读他所花的时间,欢迎点击右下角↘ 推荐。您的支持是我继续写作最大的动力,谢谢
作者:沧海月明
出处:http://www.cnblogs.com/xxcanghai/
本文地址:http://www.cnblogs.com/xxcanghai/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。