Windows命令提示符中的转义括号

您所在的位置:网站首页 尖括号被转义 Windows命令提示符中的转义括号

Windows命令提示符中的转义括号

2023-06-10 23:51| 来源: 网络整理| 查看: 265

我需要将包含尖括号()的字符串回显到Windows计算机上的文件。 基本上我想做的是以下几点: echo some string brackets >>myfile.txt

这不起作用,因为命令解释器与尖括号混淆了。 我可以像这样引用整个字符串: echo"some string brackets">>myfile.txt

但是,然后我在文件中使用了我不想要的双引号。

转义ala unix括号也不起作用: echo some string \ brackets >>myfile.txt

有想法吗?

相关讨论 报价有什么问题? 报价也将被回显。

出于某种原因,Windows转义字符为^。

1echo some string ^< with angle ^> brackets >>myfile.txt 相关讨论 好吧,反斜杠用于路径名,双引号用于包装具有空格的文件名,因此剩下的字符选择不多。 这也适用于其他字符,例如与号(&),谢谢。 很棒! echo some string ^ brackets >>con的结果是:一些字符串 都是因为原始的pc-dos使用反斜杠来表示路径和向后兼容。 我怀疑那不是随机的。我的猜测是,他们希望使用不太可能出现在普通文本中的字符,从而不会导致容易避免的但不希望出现的字符转义。

的确,官方的转义字符是^,但要小心,因为有时您需要三个^字符。这只是有时:

1234567891011C:\WINDOWS> echo ^ C:\WINDOWS> echo ^ | sort The syntax of the command is incorrect. C:\WINDOWS> echo ^^^ | sort C:\WINDOWS> echo ^^^ ^

废话的一种技巧是使用echo以外的命令来执行输出并用双引号引起来:

1234C:\WINDOWS> set/p _="" set/p _="" ,&,|,&&,||)之后,同时发生了延迟扩展和FOR变量扩展。请参阅Windows命令解释器(CMD.EXE)如何解析脚本?有关更多信息。

sin3.14指出管道可能需要多次逸出。例如:

1echo ^^^|findstr .

管道需要多次转义的原因是,管道的每一面都是在新的CMD流程中执行的,因此该行被多次解析。请参阅为什么在管道代码块中延迟扩展失败?解释Window管道实现的许多尴尬后果。

使用管道时,还有另一种避免多次转义的方法。您可以显式实例化自己的CMD流程,并用引号保护单个转义:

1cmd /c"echo ^"|findstr .

如果您想使用延迟扩展技术来避免转义,那么还会有更多的惊喜(如果您是CMD.EXE的设计专家,就不会感到惊讶,但是没有官方的MicroSoft文档可以解释这些问题)

请记住,管道的每一端都在其自己的CMD.EXE进程中执行,但是该进程不会继承延迟的扩展状态-默认为OFF。因此,您必须显式实例化自己的CMD.EXE进程,并使用/ V:ON选项启用延迟的扩展。

1234@echo off setlocal disableDelayedExpansion set"line=" cmd /v:on /c echo !test!|findstr .

请注意,父批处理脚本中的延迟扩展为OFF。

但是,如果在父脚本中启用了延迟扩展,那么一切都将变得一团糟。以下内容不起作用:

12345@echo off setlocal enableDelayedExpansion set"line=" REM - the following command fails cmd /v:on /c echo !test!|findstr .

问题在于!test!在父脚本中已展开,因此新的CMD进程正在尝试解析不受保护的和>。

您可以转义!,但这会变得棘手,因为这取决于是否引用了!。

如果未引用,则需要两次转义:

1234@echo off setlocal enableDelayedExpansion set"line=" cmd /v:on /c echo ^^!test^^!|findstr .

如果引用,则使用一个转义符:

1234@echo off setlocal enableDelayedExpansion set"line=" cmd /v:on /c"echo ^!test^!"|findstr .

但是有一个令人惊讶的技巧可以避免所有转义-将管道的左侧封闭可以防止父脚本过早地扩展!test!:

1234@echo off setlocal enableDelayedExpansion set"line=" (cmd /v:on /c echo !test!)|findstr .

但我想那也不是免费的午餐,因为批处理解析器在使用括号时在末尾引入了一个额外的(可能是不需要的)空间。

Aint批处理脚本很有趣;-)

为了在回显中使用特殊字符(例如在Windows上使用">"),您需要在其前面放置特殊的转义字符。

例如

1echo A->B

将不起作用,因为必须通过'^'来对'>'进行转义:

1 echo A-^>B

另请参见转义序列。

有一个简短的批处理文件,它打印一组基本的特殊字符及其转义序列。

Escaping the brackets ala unix doesn't work either:

echo some string \ brackets >>myfile.txt

反斜杠将被视为绝对路径名的开始。

相关讨论 相对于当前驱动器号的绝对路径名...;) 反斜杠不被认为是echo命令文本中绝对路径名的开头-只是纯文本,无论您将其发送到何处,都将通过管道将其传递。 -例如echo \ 可以正常工作。 -但是,是的,对于命令行转义字符来说,""将是一个错误的选择,因为每个需要路径或文件名的命令/程序都必须键入" "。 这个答案不能解决这个模糊的问题

您还可以使用双引号来转义特殊字符...

1echo some string"" brackets >>myfile.txt 相关讨论 那行不通。 echo some string"" brackets >>con导致:一些字符串" "括起来,但是OP希望一些字符串括号



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3