如何将 ASCII Art 存储到批处理文件中的变量中?
Posted
技术标签:
【中文标题】如何将 ASCII Art 存储到批处理文件中的变量中?【英文标题】:How to store ASCII Art into a variable in a batch file? 【发布时间】:2022-01-19 14:04:47 【问题描述】:所以我正在尝试创建一个简单的 ROCK-PAPER-SCISSORS 游戏,我想在其中显示各个元素的 ASCII 图稿。如果我能以某种方式将它们存储到变量中,以便进一步的逻辑跟进和使用这些变量,那就太好了。
....
.....
.......
........
........
........
........ .........
.................. ..
................ ..
......... .... ....
.. ....
.. ...
... ...
... ..
...........
这是一件艺术品,当我尝试将其存储到如下变量中时:
set /p scissors = " the above art "
我收到错误。
有人知道如何解决这个问题吗?
【问题讨论】:
这意味着在哪个 Windows 版本上运行? 这是一个想法,将您的游戏称为 R-P-S,然后猜猜看,您可以更轻松地输出选项,%SystemRoot%\System32\choice.exe /C RPS
。或者,如果您真的想使用表示而不是字母,@ _ X
每个都将占用相同的最小空间量。
set /P
用于提示用户输入一个值,set /P VAR = …
不会设置VAR
而是VAR
+ 空格。无论如何,你真的需要变量中的文本吗?看看这篇文章的替代品:Windows batch: Can't echo ASCII art with ._|_...
这一行:set /p scissors = " the above art "
对您的代码只字不提。你在set /p
命令行中放了什么? 第一行“以上艺术”?下面的其余几行?如果是这样,那么为什么会出现错误应该很明显......
【参考方案1】:
实现目标的另一种方法是使用 findstr 读取嵌入在文件中的数据。 findstr 命令可以分配给一个变量,允许它重复用于不同的元素:
@echo off
Setlocal EnableDelayedExpansion
Mode 1000
Set "Scissors="
Setlocal EnableDelayedExpansion
Set "RPS=For /f "tokens=2 Delims=RPS123" %%G in ('%SystemRoot%\System32\Findstr.exe /bl ":RPS#" "%~f0"')Do Echo(%%G"
Choice /C:RPS
%RPS:#=!Errorlevel!%
:RPS1
:RPS1
:RPS1 .. ... .. .. .
:RPS1 . ... ... .. . .. .
:RPS1 . .. . ... ... ......
:RPS1 ......... ..... ......
:RPS1 . ...... ..... ........ .
:RPS1 ......... ..... ......
:RPS1 .. .. ................ .
:RPS1 .. ..... .. .. .......
:RPS1 . . . ... . .. ... .
:RPS1 . ... .. . . . .
:RPS1 ... ... ..
:RPS1
:RPS1
:RPS2 .
:RPS2 . .
:RPS2 . .
:RPS2 . .
:RPS2 . .
:RPS2 . .
:RPS2. .
:RPS2 . .
:RPS2 . .
:RPS2 . .
:RPS2 . .
:RPS2 . .
:RPS2 . .
:RPS2 . .
:RPS2 .
:RPS3 ....
:RPS3 .....
:RPS3 .......
:RPS3 ........
:RPS3 ........
:RPS3 ........
:RPS3 ........ .........
:RPS3 .................. ..
:RPS3 ................ ..
:RPS3 ......... .... ....
:RPS3 .. ....
:RPS3 .. ...
:RPS3 ... ...
:RPS3 ... ..
:RPS3 ...........
【讨论】:
【参考方案2】:你可以这样定义你的变量:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set Scissors=^
....^
.....^
.......^
........^
........^
........^
........ .........^
.................. ..^
................ ..^
......... .... ....^
.. ....^
.. ...^
... ...^
... ..^
...........
然后要使用它,您可以启用延迟扩展。
SetLocal EnableDelayedExpansion
Echo(!Scissors!
然后稍后,恢复到之前的延迟扩展状态:
EndLocal
如果您不想启用延迟扩展,则输出图像需要更多工作:
For /F "Tokens=1,* Delims==" %%G In ('"(Set Scissors) 2>NUL"') Do Echo(%%G
【讨论】:
【参考方案3】:另一种方式:
@echo off
setlocal EnableDelayedExpansion
REM Define variables:
(for %%a in (
" .. ... .. .. ."
" . ... ... .. . .. ."
" . .. . ... ... ......"
" ......... ..... ......"
". ...... ..... ........ ."
" ......... ..... ......"
".. .. ................ ."
" .. ..... .. .. ......."
" . . . ... . .. ... ."
" . ... .. . . . ."
" ... ... ..") do set "rock=!rock!$%%~a") & set "rock=!rock:~1!"
(for %%a in (
" ."
" . ."
" . ."
" . ."
" . ."
" . ."
". ."
" . ."
" . ."
" . ."
" . ."
" . ."
" . ."
" . ."
" .") do set "paper=!paper!$%%~a") & set "paper=!paper:~1!"
(for %%a in (
"...."
" ....."
" ......."
" ........"
" ........"
" ........"
" ........ ........."
" .................. .."
" ................ .."
" ......... .... ...."
" .. ...."
" .. ..."
" ... ..."
" ... .."
" ...........") do set "scissors=!scissors!$%%~a") & set "scissors=!scissors:~1!"
REM Display variables:
cls
echo rock: & echo/& echo %rock:$=& echo %& echo/& echo/
echo paper: & echo/& echo %paper:$=& echo %& echo/& echo/
echo scissors: & echo/& echo %scissors:$=& echo %& echo/& echo/
【讨论】:
【参考方案4】:只要放一个选项,如果您运行的是支持 VT100 转义码的 Windows 10,您可以执行以下操作:
@echo off
for /F %%i in ('echo prompt $E ^| cmd') do set "n=%%iE"
set "scissors=%n% ....%n% .....%n% .......%n% ........%n% ........%n% ........%n% ........ .........%n% .................. ..%n% ................ ..%n% ......... .... ....%n% .. ....%n% .. ...%n% ... ...%n% ... ..%n% ..........."
echo %scissors%
【讨论】:
您在换行控制序列中缺少[
字符。 for /F %%i in ('echo(prompt $E^|cmd') do set "n=%%i[E"
@T3RR0R 在这里不相关,自己测试一下。 :)
我已经有了,它失败了,因为你已经编写了脚本,它在 cmd.exe 和 powershell.exe 中失败了 - 但是它确实在 Windows 终端中正确输出。
反之,ESC[E
则相反,它在 Cmd.exe 和 powershell 中正确输出,但在 windows 终端中不正确,除非在 cmd 选项卡中明确显示
您运行的是哪个版本的 Windows,@T3RR0R?以上是关于如何将 ASCII Art 存储到批处理文件中的变量中?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 或 Javascript 将 ASCII Art 解析为 HTML? [关闭]