如何将 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? [关闭]

如何一次读取一个字符的字符串或文件并将该字符的 ASCII 值分配给 CMD 批处理中的变量? [复制]

在 ascii 文件中存储 numpy 数组的最佳方法

如何将文件位置存储到条目窗口小部件中--Tkinter

批处理文件中的多行 IF 语句内的变量值未递增 [重复]

如何将过程中的变量值传递给 Apex 中的 Javascript 函数