CMD/Windows批处理:如何在命令参数中传递双引号和大于号?

5

我可以以多种方式向任何命令传递双引号和大于符号:'"'"\""">"

但当我尝试将它们一起传递时

C:\>echo "\">"
The system cannot find the path specified.

"\"\>"一样。我可以在单引号中让它起作用,但由于我已经处理了很多引号,所以我想把它们都放在双引号里。

有没有任何方法可以转义它?

我在Windows7上,但我认为这是一些向后兼容的“功能”,所以不确定这些信息是否相关。

编辑1:

我认为Endoro给出了正确答案......但事实并非如此简单。CMD会根据字符串中是否有转义的双引号而以不同方式处理^>。有没有人知道为什么?或者有一个不同的转义方法吗?

C:\>sh echo "\"^>"
">

C:\>sh echo "a^>"
a^>

C:\>echo "\"^>"
"\">"

C:\>echo "a^>"
"a^>"

编辑2: 这里是Monacraft建议的测试用例,使用在字符串周围加上^引号

C:\>echo ^"a/>"
The system cannot find the path specified.
(we still need to escape that > symbol)

C:\>echo ^"a/^>"
"a/>"
(work fine without \" in the string)

C:\>echo ^"\"/^>"
"\"/^>"
(add a single \" and the ^> escaping stop to works)

C:\>echo ^""/^>"
""/^>"
(ok, using ^ before the string means i dont have to escape the " anymore)

C:\>echo ^"^\"/^>"
"\"/^>"
(but what if i have an actual \" in my input that i have to escape... would ^\ prevent this from happening? nope)

@Endoro 对不起,我真的认为这是正确的答案,直到我添加了更多的测试并看到我在编辑中提到的内容。我甚至开始写一个新问题,但它基本上与以前的问题相同。我也没有轻视它...如果冒犯了您,请原谅。 - gcb
1
转义字符如 ", <, >, >> 或 | 在批处理文件中的参数中使用,批处理字符转义,转义bat文件中的百分号,逃避Windows批处理文件中的特殊字符,批处理文件中的特殊字符。 - phuclv
1个回答

3

好的,我不能给你一个完整的解释,但是如果在双引号前加上转义字符,它就可以工作:

C:\>echo "a^>"
"a^>"

C:\>echo ^"a^>"
"a>"

我认为在字符串前加上^,是告诉cmd不要将字符串内的^视为实际字符串的一部分。这就是为什么:

C:\>echo "text^>" ^"text^>"
"text^>" "text>"

这样做可以解决你的问题,但我无法给出完整的解释。

编辑 2:

好的,对于编辑 2,我只能说字符串内部不需要转义任何内容!

C:\>echo ^"\"/>"
"\"/>"

我还找到了一个网站,它解释说要转义 \ 只需要使用 \\。有关更多信息,请单击此处。对于 ",只需将引号加倍("")即可。


这让事情变得更加混乱 :) 添加 \" 仍然会破坏它。将测试用例添加到问题中。 - gcb
太棒了!我曾试图在MSDN上找到类似的东西,但没有成功!谢谢。 - gcb
关于不转义的问题,请记住我必须对用户输入的任何内容使用相同的模式。因此,如果不转义 \",那么当没有 \" 而是一个 > 时,我将会收到错误。请参见我的 edit2 中的第一个示例。 - gcb
但是它不能与您的第一个示例echo ^"\"/^>"一起使用 :) 无法以编程方式对您不知道内容的字符串进行编码,除非您编写解析器。这就是我作为解决方法所做的,但我想要删除它。我认为您发送的链接是解决方案。我只需要将"编码为""... 看看吧。稍后再次处理此问题。 - gcb
好的,如果你还有其他问题,我们可以转移到 StackChat 对话中继续讨论。如果我找到了任何其他信息,我会通知你。 - Monacraft
接受此内容,我猜这是最好的结果了。教训是:不要在CMD中传递除简单ASCII字符串以外的任何内容。 - gcb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接