批处理:自动转义特殊字符

时间:2017-03-15 05:31:54

标签: batch-file cmd escaping special-characters

据我所知,我需要在回显它们时逃避每个转义字符。 ^方法适用于少数echo个es。 (应该是这样的:)

@echo ^|
@echo ^> ^>^>

然而,当有许多角色要逃脱时,^方法不再适用。所以,我的问题是:

有没有办法摆脱所有特殊字符而没有"垃圾邮件"插入符号?

2 个答案:

答案 0 :(得分:3)

那么,当输出的字符串用双引号括起来时,不需要通过在最后一个帮助页面的命令提示符窗口中运行cmd /?来转义帮助输出中最后一段中列出的重定向运算符和其他特殊字符。

但是使用" ECHO 命令一起使用会导致双引号输出。

有几种解决方案。

第一个是分配字符串以输出到环境变量,并使用延迟扩展输出环境变量的值。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "Line=pipe = | and percent sign = %% and exclamation mark ^!"
echo !Line!
set "Line=redirection operators: < and > and >>"
echo !Line!
endlocal

或者稍微短一些,但不太可读:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "Line=pipe = | and percent sign = %% and exclamation mark ^!" & echo !Line!
set "Line=redirection operators: < and > and >>" & echo !Line!
endlocal

注意: %!必须使用另一个%并使用^进行转义,以便在分配的字符串中解释为文字字符到环境变量Line

使用子程序PrintLine的另一种解决方案:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
call :PrintLine "pipe = | and percent sign = %%%% and exclamation mark !"
call :PrintLine "redirection operators: < and > and >>"
endlocal
goto :EOF

:PrintLine
set "Line=%~1"
setlocal EnableDelayedExpansion
echo !Line!
endlocal
goto :EOF

此解决方案的缺点是:

  1. 百分号必须定义为4%的符号才能最终打印为文字字符。
  2. 由于在打印每一行时使用了 SETLOCAL ENDLOCAL ,因此速度较慢。
  3. 有关命令 SETLOCAL ENDLOCAL 的详细信息,请阅读this answer

    根据JosefZ的评论,另一个解决方案使用命令 FOR 进行隐式延迟扩展:

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    for %%I in (
        "pipe = | and percent sign = %% and exclamation mark !",
        "redirection operators: < and > and >>"
    ) do echo %%~I
    endlocal
    

    要输出的行在逗号分隔的双引号字符串列表中指定,以便由 FOR 处理。

    它具有很大的优势,即只有百分号必须通过额外的百分号符号进行转义才能禁用延迟扩展。但要输出的字符串不能包含双引号,但字符串中的""除外。

    感谢JosefZ这一贡献。

    jeb在他的回答中提供了其他很好的解决方案。

答案 1 :(得分:3)

正如Mofi所提到的,您可以使用具有延迟扩展的变量来回显任何内容。

还有一些可能的方式。

1)Disappearing quotes

for /F %%^" in ("""") do (
  echo %%~"Hello^you
  echo %%~"Line2 |&<>
)

这适用于%~"将引用该行的其余部分,但在扩展后它将消失

2)当你想要回显多行时,你应该阅读heredoc

的不同变体

3)MagicEcho可以显示任何内容而无需转义或加倍百分号,如

%magicEcho% "^!%path%<>" ^%!%<> ^