Windows命令提示符中的转义括号 |
您所在的位置:网站首页 › 尖括号被转义 › Windows命令提示符中的转义括号 |
我需要将包含尖括号()的字符串回显到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 |