在Windows命令提示符中转义尖括号

时间:2008-10-30 20:03:34

标签: windows

我需要将包含尖括号(<和>)的字符串回显到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 个答案:

答案 0 :(得分:161)

由于某种原因,Windows转义字符是^。

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

答案 1 :(得分: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>

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

答案 2 :(得分:6)

有些方法可以避免^转义序列。

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

@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变量扩展都发生在<>&|,{{1}等特殊运算符之后},&&被解析。有关详细信息,请参阅How does the Windows Command Interpreter (CMD.EXE) parse scripts?


sin3.14 points out that pipes may require multiple escapes。例如:

||

管道需要多次转义的原因是管道的每一侧都在新的CMD过程中执行,因此该行会被多次解析。有关Window管道实现的许多尴尬后果的解释,请参阅Why does delayed expansion fail when inside a piped block of code?

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

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

如果你想使用延迟扩展技术来避免逃逸,那么还有更多的惊喜(如果你是CMD.EXE设计方面的专家,你可能不会感到惊讶,但是没有官方的MicroSoft文档可以解释这个东西)

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

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

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

但如果在父脚本中启用了延迟扩展,那么所有地狱都会破裂。以下 工作:

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

问题是@echo off setlocal enableDelayedExpansion set "line=<html>" REM - the following command fails cmd /v:on /c echo !test!|findstr . 在父脚本中展开,因此新的CMD流程正在尝试解析不受保护的!test!<

你可以逃避>,但这可能会变得棘手,因为这取决于!是否被引用。

如果没有引用,则需要双重转义:

!

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

@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!

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

Aint批处理脚本编写乐趣; - )

答案 3 :(得分:2)

要使用特殊字符,例如'&gt;'在带有echo的Windows上,您需要在它之前放置一个特殊的转义字符。

例如

echo A->B

自'&gt;'起无效必须通过'^'转义:

 echo A-^>B

另见escape sequencesenter image description here

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

答案 4 :(得分:0)

  

转义括号ala unix不会   工作要么:

     

回显一些字符串\&lt;同   角度\>括号&gt;&gt; myfile.txt

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

答案 5 :(得分:-2)

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

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