【问题标题】:Escaping a batch file echo that starts with a forward slash and question mark转义以正斜杠和问号开头的批处理文件回显
【发布时间】:2024-01-11 08:21:01
【问题描述】:

有点棘手。如何在批处理文件中正确转义以下内容?

echo    /?   display this help text

这种特殊的字符组合被视为“ECHO /?”命令:

C:\Batch>ECHO       /?    display this help text
Displays messages, or turns command-echoing on or off.

  ECHO [ON | OFF]
  ECHO [message]

Type ECHO without parameters to display the current echo setting.

它不响应插入符号 (^) 转义,即。我试过了^/? /^?和^/^?。

注意:作为一种解决方法,我发现在其间插入其他字符足以绕过 ECHO 命令行处理器,例如:

echo ...   /?   display this help text

不过,这并不理想,我想知道是否有一种方法可以实现所需的输出,即使用 /?在回显消息的开头。

【问题讨论】:

    标签: batch-file escaping cmd dos echo


    【解决方案1】:

    对于转义回显参数,您可以使用替代语法echo.

    echo./?
    

    【讨论】:

    • echo. 总是访问磁盘,它会失败并输出类似echo.\..\mybat.bat (如果当前目录中存在 mybat.bat)
    • 而且它失败了,如果当前目录中存在名称为echo(没有扩展名)的文件,我会花一些时间找到问题,因为错误消息令人困惑
    • 我实际上并不知道它背后的全部理论——echo. 自 DOS 1.0 以来一直是打印空行的标准方法,我没有意识到当前的实现是如此奇怪的。你在 Powershell 中试过了吗?
    【解决方案2】:

    对于转义回显参数存在许多变体,例如echo.echo:echo=
    但似乎只有echo( 对任何附加文本是安全的。

    如果存在 echoecho[echo]echo+ 之类的文件,则这些文件将失败

    echo.
    echo[
    echo]
    echo+

    如果当前目录中存在名为 my.bat 的文件,则这些失败

    echo\..\my.bat
    echo:\..\my.bat
    echo.\..\my.bat

    这些文件独立于文件失败

    echo/?
    echo,/?
    echo;/?

    只有echo( 似乎对任何内容总是安全的

    【讨论】:

    • 还有echo=,也可以被/?破解。
    • 这些变体记录在哪里?或者为什么它们可能?这一切看起来像一个错误。
    • @utapyngo cmd.exe 是十二只猴子的随机结果。没有文档,只是测试(很多测试)