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

批处理中用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 编辑 ]
技术问题请到论坛发帖求助!

论坛里还缺点什么
我就是问你们 这句话怎么解释
为什么set里*星号有特殊作用 还那些有特殊作用呢?

TOP

测试了一下。好像只有引号支持这种用法。我换为其他的就不行了。。
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

  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 编辑 ]

TOP

关于这个问题可以解释
大家都知道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
的执行结果就明白了
天的白色影子

TOP

FOR命令中一些符号的特殊关系http://hi.baidu.com/cjiabing/blo ... 2e53594fc226c3.html

TOP

感谢楼主的分享,学习了。
现在针对以上问题做一个扩展。针对set /p =如何才能将输入结果传递。
echo off
set /p name="请输入名字"
echo %name%
这个是可以正常输出的。
但是我们经常看懂有直接给set /p =123  情况如果赋值变量
set /p =123
%:=a%
echo %a%
通过这个转换可以将变量赋值传递出来。
新手感悟

TOP

返回列表