[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理字符串替换与截取中的通配符与未定义

首先为了避免可能会有的麻烦,我要表示我搜索过了。

①字符串替换中的通配符问题,我在发帖前搜到了同样结论http://www.bathome.net/viewthrea ... =%CD%A8%C5%E4%B7%FB
不过还是提一下:【字符串替换中,星号只有出现在冒号右方第一位时才充当通配符。】
并给出一些经验补充。
  1. rem 有个指令会导致闪退,最好Win+R 输入cmd 将Bat拖入运行。 或者就看注释好啦。
  2. @echo off&setlocal enabledelayedexpansion
  3. set a=123*4?56
  4. echo %a:*4=%
  5. rem 结果为?56
  6. echo %a:3*=%
  7. rem 结果为124?56
  8. echo %a:?2=%
  9. echo 没有改变,依旧是123*4?56。即?不会充当通配符。
  10. echo %a:**=%
  11. echo 显示的是4?56。第一个*是通配符,第二个是普通字符。这是我用来检测星号的办法。
  12. echo %a:*=%
  13. echo 闪退了,用cmd打开则显示“此时不应有 =%”。这个似乎与一会要谈的“未定义吞噬”有些原理相似。即想只去掉*是不能这样写的。事实上我也不知道怎样才能只去掉*。在*前添转义字符^的话,不会闪退了,但是不会做任何改变。【愿闻解法】
  14. echo !a:*=!
  15. rem 结果是a:*=。和用%比好处就是不闪退了。虽然这结果好像没什么用,但可能可以试着利用。
  16. pause
复制代码
②字符串替换与截取中的未定义问题
这个我没搜到。第一次发现这个问题是在自己写的加法函数里的“set c1=%c1:~0,9%&set c2=%c2:~0,9%”
先提下解决办法,开变量延迟用!!

请测试以下代码(理解的话推荐直接看注释):
  1. @echo off&setlocal enabledelayedexpansion
  2. set b=1234
  3. echo %a:~9%??%b:~1%
  4. rem 结果不是"??234",也不是"~9??234",也不是"a:~9??234". 是"~9b:~1"。 是啊,?没了,b也没动。
  5. rem 另外为了证明不是逗号的锅,我这里没有用:~0,9
  6. echo !a:~9!??%b:~1%
  7. rem 结果是"~9??234"。至少在意料之中了。
  8. echo %a:~9%    %结果是~9。意料之中对吧?那我们要是手动把这个变量扩充开呢?%
  9. echo ~9??%b:~1%
  10. rem 结果是"~9??234"。和用%的那句比起来,算正常了。但更让人摸不着头脑了。
  11. rem 看看字符串替换的情况。其实差不多。
  12. echo %a:9=%??%b:4=%
  13. rem 结果是"9=b:4="。很熟悉啊,?没了b也陪葬了……后面的结果类似,就不再多举例了。
  14. pause
复制代码
如何解决呢?分行写或用!!。我推荐后者。
但因为会把未定义的那个变量各种乱改,所以建议可能遇到这种情况时,最好做手防备,比如if defined

返回列表