Windows 批次:无法使用 ._|_ 回显 ASCII 艺术
Windows batch: Can't echo ASCII art with ._|_
我制作了 ASCII 艺术作品,并试图在打开 .bat 文件时显示它。这是我拥有的(非常基本的)代码。我在网上查过,找不到任何可以帮助我的东西。有什么建议吗?
@echo off
echo __ __ _______ _____ _____ __ __
echo / /_/ / / ___ / / _ / / _ / / /_/ /
echo / __ / / /__/ / / ____/ / ___/ \ /
echo /_/ /_/ /_/ /_/ /_/ /_/ /__/
echo _____ _____ _______ __ __
echo / _ / ____ / _ / / ___ / / /_/ /
echo / _ / /___/ / _/ / / /__/ / \ /
echo /____/ /______/ /_/ /_/ /__/
pause
echo
echo # # # # #
echo .__|_|____|_|______|_|____|_|_______|_|____.
echo ############################################
echo | |
echo ############################################
echo ############################################
echo |__________________________________________|
pause
我已经可以看到自己在哭,因为我没有注意到一个小错误。
它在这一行崩溃:echo .__|_|____|_|______|_|____|_|_______|_|____.
ASCII 艺术与 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 .__
的输出,即 .__
,输入命令 _
).为了克服这个问题,你需要转义每一个 |
,比如 ^|
(^
使后面的字符失去其特殊含义)。
还有更多特殊字符,如&
、(
、)
、<
、>
、...,还有^
本身。因此,如果我需要编写这样的代码,我会将 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
我会做的是使用
rem
命令画出每行产生 ASCII 艺术并使它更花哨或者你总是可以做
type
命令并引用一个包含文本的 Python 文件。
我制作了 ASCII 艺术作品,并试图在打开 .bat 文件时显示它。这是我拥有的(非常基本的)代码。我在网上查过,找不到任何可以帮助我的东西。有什么建议吗?
@echo off
echo __ __ _______ _____ _____ __ __
echo / /_/ / / ___ / / _ / / _ / / /_/ /
echo / __ / / /__/ / / ____/ / ___/ \ /
echo /_/ /_/ /_/ /_/ /_/ /_/ /__/
echo _____ _____ _______ __ __
echo / _ / ____ / _ / / ___ / / /_/ /
echo / _ / /___/ / _/ / / /__/ / \ /
echo /____/ /______/ /_/ /_/ /__/
pause
echo
echo # # # # #
echo .__|_|____|_|______|_|____|_|_______|_|____.
echo ############################################
echo | |
echo ############################################
echo ############################################
echo |__________________________________________|
pause
我已经可以看到自己在哭,因为我没有注意到一个小错误。
它在这一行崩溃:echo .__|_|____|_|______|_|____|_|_______|_|____.
ASCII 艺术与 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 .__
的输出,即 .__
,输入命令 _
).为了克服这个问题,你需要转义每一个 |
,比如 ^|
(^
使后面的字符失去其特殊含义)。
还有更多特殊字符,如&
、(
、)
、<
、>
、...,还有^
本身。因此,如果我需要编写这样的代码,我会将 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
我会做的是使用
rem
命令画出每行产生 ASCII 艺术并使它更花哨或者你总是可以做
type
命令并引用一个包含文本的 Python 文件。