标题: 批处理中用set命令替换字符串%var:*"=set "var=% [打印本页]
作者: 随风 时间: 2007-12-27 00:25 标题: 批处理中用set命令替换字符串%var:*"=set "var=%
前两天在论坛看见有讨论变量的这种用法,现在怎么找不到了? 郁闷!
才发现原来还有这种对引号的处理方法,比较罕见,也很实用. 我来讲解一下,
也是第一次使用,经测试得到如下结论.
:- @echo off
- set var=a"bs"c
- %var:*"=set "var=%
- echo %var%
- pause
复制代码
显示结果是 bs
如果var=a"bsc 则显示 bsc var:*"= 这一句想必大家都知道,
是去除变量第一个引号及它前面的所有内容. :*"=set "var=%
感觉稀奇的是这句,它的作用是去除最后一个引号及它后面所有的内容.
但是如果变量var中不存在引号,就会报错,所以在使用这种语句前,最好先作个判断.
[ 本帖最后由 随风 于 2008-4-4 22:06 编辑 ]
作者: xxx3212 时间: 2007-12-27 00:51
论坛里还缺点什么
我就是问你们 这句话怎么解释
为什么set里*星号有特殊作用 还那些有特殊作用呢?
作者: novaa 时间: 2007-12-27 09:05
测试了一下。好像只有引号支持这种用法。我换为其他的就不行了。。
作者: zjw767676 时间: 2009-3-3 22:48
- @echo off
- set var=a"bs"c
- %var:*"=set "var=% 2>nul
- echo %var%
- pause
复制代码
- 但是如果变量var中不存在引号,就会报错,所以在使用这种语句前,最好先作个判断.
复制代码
不判断也可以加上 2>nul就可以了!
有个疑问:
echo %var:*"=set "var=%却得到set "var=bs"c
奇怪哉也!在%var:*"=set "var=%前面不能加任何东东,连
set var=%var:*"=set "var=%也不行!!!!
[ 本帖最后由 zjw767676 于 2009-3-3 23:08 编辑 ]
作者: qzwqzw 时间: 2010-4-20 20:35
关于这个问题可以解释
大家都知道CMD执行命令之前要进行预处理
预处理其中有一项就是变量扩展或者叫变量替换
那么根据上文的set var=a"bs"c
%var:*"=set "var=%在经过变量扩展后就变成了
set "var=bs"c
CMD预处理之后执行这一句set "var=bs"c
而set的自己的预处理会把引号对脱掉
同时丢弃掉引号对后的字符c
所以set实际上执行了set var=bs
至于为什么丢弃掉c
是因为如果set的参数串中出现了引号对
那么它只把引号对中的字符串作为唯一参数
其它内容一概丢弃
看看set ""test=value
以及set "path"=newpath
的执行结果就明白了
作者: cjiabing 时间: 2010-8-29 00:53
FOR命令中一些符号的特殊关系http://hi.baidu.com/cjiabing/blo ... 2e53594fc226c3.html
作者: kakalongyan 时间: 2015-11-13 16:57
感谢楼主的分享,学习了。
现在针对以上问题做一个扩展。针对set /p =如何才能将输入结果传递。
echo off
set /p name="请输入名字"
echo %name%
这个是可以正常输出的。
但是我们经常看懂有直接给set /p =123 情况如果赋值变量
set /p =123
%:=a%
echo %a%
通过这个转换可以将变量赋值传递出来。
新手感悟
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |