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


93

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

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

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

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

有想法吗?


6
报价也将被回显。
dalle

Answers:


171

由于某些原因,Windows转义字符为^。

echo some string ^< with angle ^> brackets >>myfile.txt

10
好吧,反斜杠用于路径名,双引号用于包装包含空格的文件名,因此剩下的字符选择不多。
James Curran

这也适用于其他字符,例如与号(&),谢谢。
tenfour 2011年

2
很棒!echo some string ^< with angle ^> brackets >>con结果:某些字符串<与尖括号>括号
Ross Bradbury

1
都是因为原始的pc-dos使用反斜杠来表示路径和向后兼容。
Jahmic 2014年

我怀疑这不是那么随意。我的猜测是,他们希望使用不太可能出现在普通文本中的字符,从而不会导致容易避免的但不想要的字符转义。
戴维·格雷

23

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

C:\WINDOWS> echo ^<html^>
<html>

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

C:\WINDOWS> echo ^^^<html^^^> | sort
<html>

C:\WINDOWS> echo ^^^<html^^^>
^<html^>

废话的一种技巧是使用命令而不是echo输出并用双引号引起来:

C:\WINDOWS> set/p _="<html>" <nul
<html>
C:\WINDOWS> set/p _="<html>" <nul | sort
<html>

请注意,这不会在提示文本上保留前导空格。


1
有关管道为何需要多次转义的解释,请参见我的答案的第二部分。
dbenham 2014年

这三个^^^也是在Azure DOS / Kudu控制台中转义命令所必需的。
lionello '17

8

有一些避免^转义序列的方法。

您可以使用延迟扩展的变量。以下是小批量脚本演示

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!

或者,您可以使用FOR / F循环。从命令行:

for /f "delims=" %A in ("<html>") do @echo %~A

或从批处理脚本中:

@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A

究其原因,这些方法的工作是因为特殊的运营商等之后都会出现延迟扩展和FOR变量扩展<>&|&&||被解析。请参阅Windows命令解释器(CMD.EXE)如何解析脚本?有关更多信息。


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

echo ^^^<html^^^>|findstr .

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

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

cmd /c "echo ^<html^>"|findstr .

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

请记住,管的每一面在自己的CMD.EXE过程被执行,但这一过程不会继承延迟扩张状态-它默认为关闭。因此,您必须显式实例化自己的CMD.EXE进程,并使用/ V:ON选项启用延迟的扩展。

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

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

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

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

问题是!test!在父脚本中进行了扩展,因此新的CMD进程试图解析不受保护的<>

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

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

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

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

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

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

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

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

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


3

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

例如

echo A->B

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

 echo A-^>B

另请参见转义序列在此处输入图片说明

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


0

转义ala unix括号也不起作用:

回显一些字符串\ <带尖括号\>方括号>> myfile.txt

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


2
相对于当前驱动器盘符的绝对路径名...;)
dalle

反斜杠不被认为是echo命令文本中绝对路径名的开始-只是纯文本,无论您将其发送到何处,都将通过管道传递。- echo \ 例如按预期工作。-但是,对于命令行转义字符,“ \”将是一个错误的选择,因为每个需要路径或文件名的命令/程序都必须键入“ \”。
BrainSlugs83 2014年

1
这个答案并不能解决公认的模糊问题
G-。

-2

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

echo some string "<" with angle ">" brackets >>myfile.txt

4
那行不通。echo some string "<" with angle ">" brackets >>con结果在:一些字符串“<”与角度“>”括号但OP希望有的串<与角>括号
罗斯布拉德伯里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.