我需要将包含尖括号(<和>)的字符串回显到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
想法?
答案 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
有一个简短的批处理文件,它打印一组基本的特殊字符及其转义序列。
答案 4 :(得分:0)
转义括号ala unix不会 工作要么:
回显一些字符串\&lt;同 角度\>括号&gt;&gt; myfile.txt
反斜杠将被视为绝对路径名的开头。
答案 5 :(得分:-2)
您也可以使用双引号来转义特殊字符...
echo some string "<" with angle ">" brackets >>myfile.txt