Windows批处理:无法使用._ | _回显ASCII艺术

时间:2016-03-07 22:06:58

标签: batch-file

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

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

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

它在此行崩溃:echo .__|_|____|_|______|_|____|_|_______|_|____.

2 个答案:

答案 0 :(得分:3)

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

因此,要更正您的代码,它应如下所示:

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

您正在使用的|字符是一个特殊的字符:它构成了一个所谓的" pipe",它允许将命令的输出提供给另一个(例如: type "file.txt" | find "Hello")。在您的代码中,_被视为命令,但这不存在,因此它失败(它尝试将echo .__的输出(即.__)提供给命令{{1 }})。为了解决这个问题,你需要像_一样逃避每一个|^|使下面的字符失去其特殊意义)。

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

^

type

congrats.txt

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

批处理脚本:

cake.txt

因此,您不会遇到任何文本字符的问题。上面的脚本要求 # # # # # .__|_|____|_|______|_|____|_|_______|_|____. ############################################ | | ############################################ ############################################ |__________________________________________| 文件与脚本本身位于同一目录中。

但是,如果您确实要在批处理文件中包含所有内容,请记住以下选项:

您可以定义类似数组的变量并使用@echo off type "%~dp0congrats.txt" > nul pause echo( type "%~dp0cake.txt" > nul pause 来显示它们,假设这些变量名称不在其他地方使用:

*.txt

或者,如果您不想冒任何其他代码部分覆盖任何变量值的风险,您可以直接在批处理文件中嵌入ASCII艺术并使用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

答案 1 :(得分:-2)

我会做的就是使用

rem

命令绘制出每行产生ASCII艺术作品并使其更加精美的图形,或者您总是可以这样做

type

命令并刷新其中包含文本的Python文件。