2008-10-30 172 views
77

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

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

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

摆脱支架翼UNIX无法正常工作或:
echo some string \< with angle \> brackets >>myfile.txt

想法?

+0

报价有什么问题? – Oskar 2008-10-30 20:10:02

+3

引号也会被回显。 – dalle 2008-10-30 20:12:05

回答

138

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

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

好吧,反斜杠用于路径名,双引号是用来包装具有空格的文件名,所以没有多少字符选择。 – 2008-10-30 20:27:57

+0

这也适用于&符号(&)等其他字符,谢谢。 – tenfour 2011-02-23 17:20:21

+2

非常棒! `回显一些字符串^ <带有角度^>括号>> con`结果为: _some string 括号_ – 2011-06-16 14:33:12

0

逃离ALA UNIX括号不 工作之一:

呼应一些字符串\ <与 角度\>括号>> myfile.txt复制

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

-2

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

echo some string "<" with angle ">" brackets >>myfile.txt 
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> 

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

5

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

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

@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变量扩展特殊的运营商如<>&发生后, |&&||被解析。有关更多信息,请参阅How does the Windows Command Interpreter (CMD.EXE) parse scripts?


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

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

管需要多个逸出的原因是因为在管的每一侧在一个新的CMD处理被执行的,所以线被解析多次。请参阅Why does delayed expansion fail when inside a piped block of code?以了解Window管道实施的许多令人尴尬的后果。

还有一种避免使用管道时出现多次转义的方法。你可以明确实例自己的CMD进程,保护与报价单逃生:

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

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

请记住,管道的每一边都在其自己的CMD.EXE进程中执行,但该进程确实是不是继承延迟扩展状态 - 它默认为OFF。因此,您必须明确实例化您自己的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 . 

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

批次是不是没有乐趣的脚本;-)

1

为了使用特殊字符,如“>” Windows上与之呼应,你需要在它之前放置一个特殊的转义字符。

例如

echo A->B 

将没有工作,因为 '>' 必须通过 '^' 进行转义:

echo A-^>B 

escape sequences见。 enter image description here

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