【问题标题】:How to store ASCII Art into a variable in a batch file?如何将 ASCII Art 存储到批处理文件中的变量中?
【发布时间】: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 命令行中放了什么? 第一行“以上艺术”?下面的其余几行?如果是这样,那么为什么会出现错误应该很明显......

标签: batch-file ascii-art


【解决方案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?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        相关资源
        最近更新 更多