【问题标题】:Windows batch: Can't echo ASCII art with ._|_Windows 批处理:无法使用 ._|_ 回显 ASCII 艺术
【发布时间】:2016-06-21 16:07:04
【问题描述】:

我制作了 ASCII 艺术作品,并试图在 .bat 文件打开时显示它。这是我拥有的(绝大多数基本的)代码。我在网上查了一下,并没有真正找到任何可以帮助我的东西。有什么建议吗?

@echo off
echo    __  __    _______    _____     _____     __  __
echo   / /_/ /   / ___  /   /  _  /   /  _  /   / /_/  /
echo  / __  /   / /__/ /   / ____/   /  ___/     \   /
echo /_/ /_/   /_/  /_/   /_/       /_/          /__/
echo    _____          _____     _______  __  __
echo   /  _ /  ____   /  _   /  / ___  / / /_/  /
echo  /  _ /  /___/  /  _/  /  / /__/ /  \    /
echo /____/         /______/  /_/  /_/    /__/
pause
echo  
echo     #      #        #      #         #
echo .__|_|____|_|______|_|____|_|_______|_|____.
echo ############################################
echo |                                          |
echo ############################################
echo ############################################
echo |__________________________________________|
pause

我已经可以看到自己在哭,因为我没有注意到一个小错误。

它在这条线上崩溃:echo .__|_|____|_|______|_|____|_|_______|_|____.

【问题讨论】:

  • 是的,我知道这是一个糟糕的礼物 :) .
  • | 字符构成所谓的“管道”,它允许将命令的输出馈送到另一个命令,例如:type "file.txt" | find "Hello";在您的代码中,_ 被视为不存在的命令,因此它失败(它尝试将echo .__ 的输出,即.__ 提供给_);要克服这个问题,您需要像 ^| 一样转义每个 |^ 使以下字符失去其特殊含义)...
  • ... 或使用另一种方法来显示特殊字符,例如用引号将它们括起来:set /P "=.__|_|____|_|______|_|____|_|_______|_|____." < NUL & echo/
  • @aschipfl 的方法效果很好。我完全忘记了 type 命令:/ 谢谢你们!
  • 顺便说一句,试着想出一个对你的问题足够具体的标题——“回声错误”非常模糊。如果您在询问之前将其缩小为单个字符,并且可以输入类似“can't echo ascii art with |”之类的内容在标题中,那会更好。

标签: windows batch-file cmd escaping ascii-art


【解决方案1】:

ASCII 艺术与echo 命令一起使用可能有点棘手,因为有几个字符会被命令处理器特别处理。

所以要更正您的代码,它应该如下所示:

@echo off
echo    __  __    _______    _____     _____     __  __
echo   / /_/ /   / ___  /   /  _  /   /  _  /   / /_/  /
echo  / __  /   / /__/ /   / ____/   /  ___/     \   /
echo /_/ /_/   /_/  /_/   /_/       /_/          /__/
echo    _____          _____     _______  __  __
echo   /  _ /  ____   /  _   /  / ___  / / /_/  /
echo  /  _ /  /___/  /  _/  /  / /__/ /  \    /
echo /____/         /______/  /_/  /_/    /__/
pause
echo(
echo     #      #        #      #         #      
echo .__^|_^|____^|_^|______^|_^|____^|_^|_______^|_^|____.
echo ############################################
echo ^|                                          ^|
echo ############################################
echo ############################################
echo ^|__________________________________________^|
pause

您使用的| 字符是一个非常特殊的字符:它构成了一个所谓的“管道”,它允许将命令的输出馈送到另一个命令(例如:type "file.txt" | find "Hello")。在您的代码中,_ 被视为命令,但它不存在,因此它失败(它尝试将echo .__ 的输出,即.__ 提供给命令_)。要克服这个问题,您需要像 ^| 一样转义每个 |^ 使以下字符失去其特殊含义)。


还有更多特殊字符,如&()<>、...,还有^ 本身。因此,如果我需要编写这样的代码,我会将 ASCII 艺术文本导出到外部文件中,并使用 type 命令显示其内容,如下所示:

congrats.txt:

   __  __    _______    _____     _____     __  __
  / /_/ /   / ___  /   /  _  /   /  _  /   / /_/  /
 / __  /   / /__/ /   / ____/   /  ___/     \   /
/_/ /_/   /_/  /_/   /_/       /_/          /__/
   _____          _____     _______  __  __
  /  _ /  ____   /  _   /  / ___  / / /_/  /
 /  _ /  /___/  /  _/  /  / /__/ /  \    /
/____/         /______/  /_/  /_/    /__/

cake.txt:

    #      #        #      #         #      
.__|_|____|_|______|_|____|_|_______|_|____.
############################################
|                                          |
############################################
############################################
|__________________________________________|

批处理脚本:

@echo off
type "%~dp0congrats.txt"
> nul pause
echo(
type "%~dp0cake.txt"
> nul pause

因此,您永远不会遇到任何文本字符的问题。上面的脚本要求*.txt 文件与脚本本身位于同一目录中。


但是,如果您确实想在批处理文件中包含所有内容,我会考虑以下选项:

您可以定义类似数组的变量并使用set 来显示它们,假设这些变量名称没有在其他地方使用:

@echo off

set "CONGRATS_00=.   __  __    _______    _____     _____     __  __"
set "CONGRATS_01=.  / /_/ /   / ___  /   /  _  /   /  _  /   / /_/  /"
set "CONGRATS_02=. / __  /   / /__/ /   / ____/   /  ___/     \   /"
set "CONGRATS_03=./_/ /_/   /_/  /_/   /_/       /_/          /__/"
set "CONGRATS_04=.   _____          _____     _______  __  __"
set "CONGRATS_05=.  /  _ /  ____   /  _   /  / ___  / / /_/  /"
set "CONGRATS_06=. /  _ /  /___/  /  _/  /  / /__/ /  \    /"
set "CONGRATS_07=./____/         /______/  /_/  /_/    /__/"

set "CAKE_00=.    #      #        #      #         #      "
set "CAKE_01=..__|_|____|_|______|_|____|_|_______|_|____."
set "CAKE_02=.############################################"
set "CAKE_03=.|                                          |"
set "CAKE_04=.############################################"
set "CAKE_05=.############################################"
set "CAKE_06=.|__________________________________________|"

call :SUB "CONGRATS"
> nul pause
echo(
call :SUB "CAKE"
> nul pause
exit /B

:SUB "name"
for /F "delims=" %%V in ('
    set "%~1_"
') do (
    set "VALUE=%%V"
    setlocal EnableDelayedExpansion
    echo(!VALUE:*.=!
    endlocal
)
exit /B

或者,如果您不想冒任何变量值被其他代码部分覆盖的风险,您可以将 ASCII 艺术直接嵌入批处理文件中并使用for /F 循环读取它:

@echo off
goto :BEGIN

:::congrats.   __  __    _______    _____     _____     __  __
:::congrats.  / /_/ /   / ___  /   /  _  /   /  _  /   / /_/  /
:::congrats. / __  /   / /__/ /   / ____/   /  ___/     \   /
:::congrats./_/ /_/   /_/  /_/   /_/       /_/          /__/
:::congrats.   _____          _____     _______  __  __
:::congrats.  /  _ /  ____   /  _   /  / ___  / / /_/  /
:::congrats. /  _ /  /___/  /  _/  /  / /__/ /  \    /
:::congrats./____/         /______/  /_/  /_/    /__/

:::cake.    #      #        #      #         #      
:::cake..__|_|____|_|______|_|____|_|_______|_|____.
:::cake.############################################
:::cake.|                                          |
:::cake.############################################
:::cake.############################################
:::cake.|__________________________________________|

:BEGIN
set "BATCH=%~f0"
call :SUB "congrats"
> nul pause
echo(
call :SUB "cake"
> nul pause
exit /B

:SUB "name"
for /F "delims=" %%L in ('
    findstr /L /I /B /C:":::%~1." "%BATCH%"
') do (
    set "LINE=%%L"
    setlocal EnableDelayedExpansion
    echo(!LINE:*.=!
    endlocal
)
exit /B

【讨论】:

【解决方案2】:

我会做的是使用

rem

命令画出每一行产生 ASCII 艺术并使其更花哨,或者你可以随时这样做

type

命令并引用包含文本的 Python 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2012-01-22
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2010-12-14
    相关资源
    最近更新 更多