我需要将以下没有新行的字符串写入新文件:
R"(
我尝试过:
echo|set /p = R"( > ..\web\index.min.html
echo|set /p = R^"( > ..\web\index.min.html
echo|set /p = R\"( > ..\web\index.min.html
没有结果。
但是如果我写:
echo|set /p = R""( > ..\web\index.min.html
我得到:
R""(
两个双引号而不是一个。 我该如何解决我的问题?
答案 0 :(得分:2)
通常,使用<nul set /p =text
代替echo|set /p =text
会更好,更有效
SET / P提示符下的bizarre rules在Windows版本之间不一致:(
最好将所有重定向都放在命令之前,以便=
之后的所有字符都属于提示的一部分,但规则中引用的情况除外。
棘手的问题或引起问题的内容以空格,=
和引号引起。
值得庆幸的是,引号可以很容易地解决。将所需的字符串用引号引起来=
的右端:
<nul >..\web\index.min.html set /p ="R"("
第一个引号将被去除,最后一个引号和最后一个引号之后的所有尾随字符将被去除。
或者执行上述操作,并在整个结构(包括=
)周围添加额外的一组引号:
<nul >..\web\index.min.html set /p "="R"(""
前两个引号被删除,最后两个引号也被删除,第二到最后一个引号之后的所有字符都将被忽略。
我不建议这样做,但是以下每个选项也可以使用:
<nul >..\web\index.min.html set /p ="R"(" IGNORED
<nul >..\web\index.min.html set /p "="R"(" IGNORED " IGNORED
答案 1 :(得分:2)
您的尝试失败,因为有一个(引号)引号对解析器隐藏了重定向表达式> ..\web\index.min.html
。使用""
之所以有效,是因为结尾有一个"
,因此可以识别重定向。
即使正常的转义(例如^"
,而不是\"
)在这里也无济于事,因为其中涉及一个在新|
中执行任一边的管道(cmd
)实例,因此转义已由父实例占用,(右)子实例已收到未转义的"
。
因此,您需要进行两次转义才能使其正常工作:
echo/|set /P =R^^^"(> "..\web\index.min.html"
但是如果您避免使用管道,则单转义就足够了:
< nul set /P =R^"(> "..\web\index.min.html"
尽管如dbenham的answer所示将重定向表达式移到最前面,这也许是我也将寻求解决此问题的最佳解决方案。请注意,实际上并不需要其他引号:
< nul > "..\web\index.min.html" set /p =R"(