• 关于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配合%%却没有任何错误

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

  • 相关阅读:
    如何去掉NavigationBar的backButton
    iDoubs的编译问题以及解决方案
    【五一呈献】通用高性能 Windows Socket 组件 HPSocket v2.1.1 正式发布
    PortalBasic Java Web 应用开发框架:应用篇(十三) —— REST Convention
    如何养成良好的 C++ 编程习惯(一)—— 内存管理
    PortalBasic Java Web 应用开发框架:应用篇(十一) —— 整合 Spring
    整理发布本人所有博客文章中涉及的代码与工具(大部分是C++和Java)
    PortalBasic Java Web 应用开发框架:应用篇(十四) —— 异步 Action
    【双旦献礼】PortalBasic Java Web 应用开发框架 v3.0.1 正式发布(源码、示例及文档)
    PortalBasic Java Web 应用开发框架:应用篇(十二) —— Action Convention
  • 原文地址:https://www.cnblogs.com/xxcanghai/p/4584042.html
Copyright © 2020-2023  润新知