Board logo

标题: [文本处理] [讨论]set/p提示字符串中含双引号时的特殊处理 [打印本页]

作者: qzwqzw    时间: 2013-2-3 13:38     标题: [讨论]set/p提示字符串中含双引号时的特殊处理

本帖最后由 qzwqzw 于 2013-2-3 13:40 编辑

前不久的一个小代码里出现了一个运行时错误
由此引出set/p对提示字符串中含双引号时的特殊处理
首先看以下测试内容
D:\>set /p var="test"<nul
test
D:\>set /p var="te st"<nul
te st
D:\>set /p var="te st",other<nul
te st
D:\>set /p var=pre "te st",other<nul
pre "te st",other
D:\>set /p var=" s1 " s2 " s3 "<nul
s1 " s2 " s3
D:\>set /p var=" s1 < s2 > s3 "<nul
s1 < s2 > s3
D:\>set /p var=" s1 " ; , = " s3 "<nul
s1 " ; , = " s3
D:\>

总的来说
如果set/p中的提示字符串中的首字符是双引号
则它会自动脱去提示字符串中第一个以及最后一个双引号
并可以脱去最后一个双引号之后的字符串内容

简单的说
它会自动脱去字符串最外层的双引号
这与变量修饰符%~var的作用相似
也与for/f对字符串引号的处理规则相似
相比前二者它可以一般化处理内部引号对中含分隔符的情况
也就是说这个含有内部分隔符的字符串不会被切分
作者: Demon    时间: 2013-2-3 17:11

如果第一个字符是双引号,那么就调用strrchr函数返回最后一个双引号的指针,然后将指针指向的值改成NULL。
作者: CrLf    时间: 2013-2-5 15:25

办法是加双层双引号:
  1. set /p var=""test""<nul
复制代码
但是这会造成内部的字符串不能被转义,又有两个延伸方案:
  1. set /p "var=""test"""<nul
复制代码
  1. set /p var=^""test"^"<nul
复制代码

作者: 悬崖之树    时间: 2013-2-5 19:52

回复 3# CrLf


    能解释下为什么可以这样写吗?原理是什么?
作者: CrLf    时间: 2013-2-5 20:00

回复 4# 悬崖之树


    其实楼主已经提到了,只是没有明言怎么解决:
如果set/p中的提示字符串中的首字符是双引号
则它会自动脱去提示字符串中第一个以及最后一个双引号
并可以脱去最后一个双引号之后的字符串内容


    你看,自动脱去提示字符串中第一个以及最后一个双引号,而不是自动脱去提示字符串中头部以及尾部的所有双引号,这也可以认为是 cmd 中约定俗成的普遍规则吧




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2