Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理:自动转义特殊字符_Batch File_Cmd_Escaping_Special Characters - Fatal编程技术网

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

Batch file 批处理:自动转义特殊字符,batch-file,cmd,escaping,special-characters,Batch File,Cmd,Escaping,Special Characters,据我所知,我需要在回显每个转义字符时转义它们。^方法适用于一些echoes。(应该是:) 但是,当有很多字符需要转义时,^方法将不再有效。所以,我的问题是: 是否有任何方法可以在不“滥发”插入符号的情况下转义所有特殊字符?好的,当要输出的字符串用双引号括起来时,无需通过在最后一个帮助页面上的命令提示窗口中运行cmd/?来转义重定向运算符和帮助输出最后一段中列出的其他特殊字符 但是使用“与ECHO命令联机会导致双引号输出 有几种解决方案 第一种方法是将要输出的字符串指定给环境变量,并使用延迟展开输

据我所知,我需要在回显每个转义字符时转义它们。
^
方法适用于一些
echo
es。(应该是:)

但是,当有很多字符需要转义时,
^
方法将不再有效。所以,我的问题是:


是否有任何方法可以在不“滥发”插入符号的情况下转义所有特殊字符?

好的,当要输出的字符串用双引号括起来时,无需通过在最后一个帮助页面上的命令提示窗口中运行
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
这种解决方案的缺点是:

  • 百分号必须定义为4个百分号,才能最终打印为文字字符
  • 由于在打印每行时使用了SETLOCALENDLOCAL,因此速度较慢
  • 有关命令SETLOCALENDLOCAL的详细信息,请阅读

    另一个解决方案根据comment by使用命令进行隐式延迟扩展:

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    for %%I in (
        "pipe = | and percent sign = %% and exclamation mark !",
        "redirection operators: < and > and >>"
    ) do echo %%~I
    endlocal
    
    @echo关闭
    setlocal EnableExtensions DisableDelayedExpansion
    对于%%I in(
    “管道=|和百分号=%%和感叹号!”,
    “重定向运算符:<和>和>>”
    )做回显%%~I
    端部
    
    要输出的行在逗号分隔的双引号字符串列表中指定,以供处理

    它有一个很大的优点,就是只有百分号必须转义,而延迟扩展上的附加百分号必须被禁用。但是要输出的字符串不能包含双引号,字符串中的
    除外

    谢谢你的贡献


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

    正如Mofi所提到的,您可以使用延迟扩展的变量来响应任何内容

    还有一些可能的方法

    (一)


    对于%%G in(“|“,”>\^“,”>),因为我太无聊了,我做了一些测试,发现
    call
    set”a=
    慢两倍,而且
    call
    在文本中用插入符号加上感叹号,对于/l%%p in(1,1100)do for/F%%^”in(““”““”)do(echo%%~“^you&echo%%~”)Line2 |&
    不起作用?@SteveFest将第二个回音放在新行中,因为
    &
    不会被解析,但第二个
    %%~“
    将离开引用的上下文
    @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 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
    
    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    for %%I in (
        "pipe = | and percent sign = %% and exclamation mark !",
        "redirection operators: < and > and >>"
    ) do echo %%~I
    endlocal
    
    for /F %%^" in ("""") do (
      echo %%~"Hello^you
      echo %%~"Line2 |&<>
    )
    
    %magicEcho% "^!%path%<>" ^%!%<> ^