标题: [文本处理] 批处理字符串替换与截取中的通配符与未定义 [打印本页]
作者: hongrk 时间: 2019-4-11 23:35 标题: 批处理字符串替换与截取中的通配符与未定义
首先为了避免可能会有的麻烦,我要表示我搜索过了。
①字符串替换中的通配符问题,我在发帖前搜到了同样结论http://www.bathome.net/viewthrea ... =%CD%A8%C5%E4%B7%FB
不过还是提一下:【字符串替换中,星号只有出现在冒号右方第一位时才充当通配符。】
并给出一些经验补充。- rem 有个指令会导致闪退,最好Win+R 输入cmd 将Bat拖入运行。 或者就看注释好啦。
- @echo off&setlocal enabledelayedexpansion
- set a=123*4?56
- echo %a:*4=%
- rem 结果为?56
- echo %a:3*=%
- rem 结果为124?56
-
- echo %a:?2=%
- echo 没有改变,依旧是123*4?56。即?不会充当通配符。
- echo %a:**=%
- echo 显示的是4?56。第一个*是通配符,第二个是普通字符。这是我用来检测星号的办法。
- echo %a:*=%
- echo 闪退了,用cmd打开则显示“此时不应有 =%”。这个似乎与一会要谈的“未定义吞噬”有些原理相似。即想只去掉*是不能这样写的。事实上我也不知道怎样才能只去掉*。在*前添转义字符^的话,不会闪退了,但是不会做任何改变。【愿闻解法】
- echo !a:*=!
- rem 结果是a:*=。和用%比好处就是不闪退了。虽然这结果好像没什么用,但可能可以试着利用。
- pause
复制代码
②字符串替换与截取中的未定义问题
这个我没搜到。第一次发现这个问题是在自己写的加法函数里的“set c1=%c1:~0,9%&set c2=%c2:~0,9%”
先提下解决办法,开变量延迟用!!
请测试以下代码(理解的话推荐直接看注释):- @echo off&setlocal enabledelayedexpansion
- set b=1234
- echo %a:~9%??%b:~1%
- rem 结果不是"??234",也不是"~9??234",也不是"a:~9??234". 是"~9b:~1"。 是啊,?没了,b也没动。
- rem 另外为了证明不是逗号的锅,我这里没有用:~0,9
-
- echo !a:~9!??%b:~1%
- rem 结果是"~9??234"。至少在意料之中了。
-
- echo %a:~9% %结果是~9。意料之中对吧?那我们要是手动把这个变量扩充开呢?%
- echo ~9??%b:~1%
- rem 结果是"~9??234"。和用%的那句比起来,算正常了。但更让人摸不着头脑了。
-
- rem 看看字符串替换的情况。其实差不多。
- echo %a:9=%??%b:4=%
- rem 结果是"9=b:4="。很熟悉啊,?没了b也陪葬了……后面的结果类似,就不再多举例了。
- pause
复制代码
如何解决呢?分行写或用!!。我推荐后者。
但因为会把未定义的那个变量各种乱改,所以建议可能遇到这种情况时,最好做手防备,比如if defined
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |