据我所知,我需要在回显它们时逃避每个转义字符。 ^
方法适用于少数echo
个es。 (应该是这样的:)
@echo ^|
@echo ^> ^>^>
然而,当有许多角色要逃脱时,^
方法不再适用。所以,我的问题是:
有没有办法摆脱所有特殊字符而没有"垃圾邮件"插入符号?
答案 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
此解决方案的缺点是:
有关命令 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)