有一些避免^
转义序列的方法。
您可以使用延迟扩展的变量。下面是一个小批量脚本演示
@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 .
但我想即使这不是免费的午餐,因为当使用括号时,批解析器会在末尾引入一个额外的(可能不需要的)空间。
批次是不是没有乐趣的脚本;-)
报价有什么问题? – Oskar 2008-10-30 20:10:02
引号也会被回显。 – dalle 2008-10-30 20:12:05