如何写入包含双引号且没有换行的文件文本

时间:2019-10-10 19:02:43

标签: windows batch-file cmd

我需要将以下没有新行的字符串写入新文件:

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""(

两个双引号而不是一个。 我该如何解决我的问题?

2 个答案:

答案 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"

尽管如dbenhamanswer所示将重定向表达式移到最前面,这也许是我也将寻求解决此问题的最佳解决方案。请注意,实际上并不需要其他引号:

< nul > "..\web\index.min.html" set /p =R"(