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

[文本处理] [讨论]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对字符串引号的处理规则相似
相比前二者它可以一般化处理内部引号对中含分隔符的情况
也就是说这个含有内部分隔符的字符串不会被切分
天的白色影子

如果第一个字符是双引号,那么就调用strrchr函数返回最后一个双引号的指针,然后将指针指向的值改成NULL。

TOP

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

TOP

回复 3# CrLf


    能解释下为什么可以这样写吗?原理是什么?
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

回复 4# 悬崖之树


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


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

TOP

返回列表