Board logo

标题: 批处理中用set命令替换字符串%var:*"=set "var=% [打印本页]

作者: 随风    时间: 2007-12-27 00:25     标题: 批处理中用set命令替换字符串%var:*"=set "var=%

前两天在论坛看见有讨论变量的这种用法,现在怎么找不到了? 郁闷!
才发现原来还有这种对引号的处理方法,比较罕见,也很实用. 我来讲解一下,
也是第一次使用,经测试得到如下结论.
:
  1. @echo off
  2. set var=a"bs"c
  3. %var:*"=set "var=%
  4. echo %var%
  5. 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

  1. @echo off
  2. set var=a"bs"c
  3. %var:*"=set "var=%  2>nul
  4. echo %var%
  5. pause
复制代码
  1. 但是如果变量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://www.bathome.net/) Powered by Discuz! 7.2