如何在Windows批处理文件中去除ECHO输出字符串中的引号?

52

我正在创建一个Windows批处理文件,但必须ECHO一个庞大的复杂字符串,因此我不得不在两端放双引号。问题是引号也被一同ECHO到我要写入的文件中。如何ECHO这样的字符串并去掉引号?

更新:

我花了两天时间来解决这个问题,最终成功地把一些东西凑合在一起。Richard的答案能够去除引号,但即使我将ECHO放在子程序中并直接输出该字符串,Windows仍然会卡在字符串中的字符上。我将接受Richard的答案,因为它回答了所问的问题。

最终我使用了Greg的sed解决方案,但不得不进行修改,因为在sed / windows中存在错误/功能(没有文档也没有帮助)。使用sed有一些注意事项:必须使用双引号而不是单引号,不能直接转义字符串中的双引号,必须用^转义(例如^"),然后开始下一段字符串。此外,有人指出,如果将输入导管输送到sed,则字符串中有一个管道就会出现错误(由于在我的最终解决方案中找到了一种方法,不需要在字符串中使用所有引号,只需删除所有引号,我从未能够将最后一个引号独立删除。)感谢大家的帮助。

13个回答

1

丹尼尔·布兹因斯基的回答非常出色。即使在输出中存在特殊字符的情况下也能正常工作。例如:

C:\> for /f "usebackq tokens=2 delims=:" %i in (`%comspec%\..\ping -n 1 -w 200 10.200.1.1 ^| \
     findstr /c:"TTL="`) do echo|set /p="%i"

bytes=32 time<1ms TTL=255

如果您尝试使用不带引号的简单回声,由于变量中的“<”,会出现错误:
C:\> set "output=bytes=32 time<1ms TTL=255"
C:\> echo %output%
The system cannot find the file specified.

C:\> echo|set /p="%output%"
bytes=32 time<1ms TTL=255

1
你好,欢迎来到SO--这更适合作为评论而不是答案(尽管作为新贡献者,您可能没有写评论的权限)。无论如何,请参阅https://stackoverflow.com/help/how-to-answer以获取答案的指南。 - HardcoreHenry
请注意,这将会提高%ERRORLEVEL%。请查看我在Daniel Budzyński的回答下的评论。 - Alex Che

0

暴力方法:

echo "foo <3 bar" | sed -e 's/\(^"\|"$\)//g'

这需要找到一个合适的Win32版本的sed,当然。

0

http://unxutils.sourceforge.net/ 是 GNU 工具的本地 win32 端口,包括 sed、gawk、grep 和 wget。 (抱歉我没有足够的声望将其发布为评论!)


好主意,对于大多数情况,我建议使用unxutils而不是cygwin。 - Greg Hewgill

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