【问题标题】:Batch file error "/100 was unexpected at this time"批处理文件错误“/100 在这个时候是意外的”
【发布时间】:2021-02-26 03:05:09
【问题描述】:

我用批处理脚本制作了一个有趣的游戏,但是在这段代码中我有一个错误消息“/100 出乎意料”我真的不明白为什么?请帮帮我!!

@echo off
mode con cols=110 lines=32
setlocal enabledelayedexpansion

set npctier=0
goto randomnpc

:randomnpc
if %npctier% EQU 0 ( 
set npctype=Wooden Dummy
set /a npclvl=%random% %% 5+1
set /a npchp=%npclvl% * 100
set /a npcdmg=0
set /a npcdef=(%npchp%*5)/100
set /a npcxp=%npclvl%*100 )

:combatchoice
echo.
echo. You see %npctype% level %npclvl%.
echo.
echo. The %npctype%'s Health: %npchp% HP
echo.
goto main

【问题讨论】:

  • ) 直接位于 / 之前的 ) 被视为 IF %npctier%... 语句的右括号,需要用插入符号 (^) 转义因此:^)
  • 除此之外,您正在使用 % 扩展来扩展变量,这将使用 If 块执行之前变量所持有的值进行扩展,因此即使在纠正了括号问题之后,您也会得到一个除以0 错误。

标签: windows if-statement batch-file cmd syntax


【解决方案1】:

在您为创建一个重复代码的冗长脚本而忘乎所以之前,我认为向您介绍批处理宏是值得的。

Batch 中的宏是分配给变量的命令或命令块,通过使用 For 循环与 If / Else 条件相结合,可用于捕获参数,从而允许将变量用作函数。

下面的示例包含一个宏的两个变体,可用于轻松生成不同的遭遇类型,只需最少的重复脚本,同时还避免使用低效的函数调用。

必须在启用延迟扩展之前定义宏,因为在宏执行期间引用的变量是使用 ! 扩展定义的,因此在扩展时解析宏的值是解析时变量的值,而不是它是定义时的值。

@echo off
mode con cols=110 lines=32 
(Set \n=^^^
%= macro newline DNR =%
)
(Set LF=^


%= Linefeed DNR =%)

rem Example 1: npc generation; Fixed Formula macro
rem USAGE: %npc{generic}%{Npc name / type}{npc max level}{npc multiplier}{damage value or formula}
Set npc{generic}=For %%n in (1 2)Do if %%n==2 (%\n%
 For /F "Tokens=1,2,3,4 Delims={}" %%G in ("!Params!")Do (%\n%
  Set "npctype=%%G" %\n%
  Set /a "npclvl= !random! %% %%H + 1" %\n%
  Set /a "npchp= !npclvl! * %%I" %\n%
  Set /a "npcdmg= %%J" %\n%
  Set /a "npcdef= ( !npchp! * %%H ) / %%I" %\n%
  Set /a "npcxp=!npclvl! * %%I" %\n%
  echo/Enemy: !npctype!!LF!level: !npclvl!!LF!HP: !npchp!!LF!Damage: !npcdmg!!LF!Defence: !npcdef!!LF!XP: !npcxp!!LF!%\n%
 )%\n%
) Else Set Params=

rem Example 2: npc generation; Supplied Formula macro
rem USAGE: %npc{boss}%{Npc name / type}{level value or formula}{hp value or formula}{damage value or formula}{defense value or formula}{xp value or formula}
Set npc{boss}=For %%n in (1 2)Do if %%n==2 (%\n%
 For /F "Tokens=1,2,3,4,5,6 Delims={}" %%G in ("!Params!")Do (%\n%
  Set "npctype=%%G" %\n%
  Set /a "npclvl= %%H " %\n%
  Set /a "npchp= %%I " %\n%
  Set /a "npcdmg= %%J " %\n%
  Set /a "npcdef= %%K " %\n%
  Set /a "npcxp= %%L " %\n%
  echo/Enemy: !npctype!!LF!level: !npclvl!!LF!HP: !npchp!!LF!Damage: !npcdmg!!LF!Defence: !npcdef!!LF!XP: !npcxp!!LF!%\n%
 )%\n%
) Else Set Params=
rem enable delayed expansion after macro definitions
setlocal enableextensions enabledelayedexpansion

:randomnpc
 %npc{generic}%{Wooden Dummy}{5}{100}{0}
 Pause
 %npc{boss}%{Dragon}{!random! %% 10 + 10}{npclvl * 200}{npchp / 20}{npchp / (npclvl / 2)}{npclvl * 150}
Endlocal
Goto :Eof

【讨论】:

  • @PhuocPham 如果您对开发批处理游戏引擎、游戏设计或如何实现某些结果/效果还有其他问题,我建议您在 dostips.com 上询问他们 - 因为一般认为 sush 问题是题外话堆栈溢出。
【解决方案2】:

如果你希望保持相同的结构,那么这样的东西会更好:

@Echo Off
SetLocal EnableExtensions
%__APPDIR__%mode.com 110, 32
Set "npctier=0"

:randomnpc
If %npctier% Equ 0 (
    Set "npctype=Wooden Dummy"
    Set "npcdmg=0"
    Set /A "npclvl=(%RANDOM% %% 5) + 1"
    Set /A "npchp=npclvl * 100, npcdef=npclvl * 5, npcxp=npchp"
)

:combatchoice
Echo=
Echo You see %npctype% level %npclvl%.
Echo=
Echo The %npctype%'s Health: %npchp% HP
Echo=
GoTo main

您应该注意,可以在一条算术指令中使用Set /A 定义多个值

【讨论】:

    【解决方案3】:

    我建议先打开一个command prompt,运行set /?,然后从第一页的顶部到最后一页的底部仔细完整地阅读输出帮助。有说明:

    表达式中的任何非数字字符串都被视为环境变量名称,其值在使用前转换为数字。如果指定了环境变量名称但未在当前环境中定义,则使用零值。这允许您对环境变量值进行算术运算,而无需键入所有这些 % 符号来获取它们的值。

    所以可以只写set /A npchp=npclvl * 100,因为算术表达式内部的npclvl被解释为环境变量的名称,命令行甚至在以(开头并以匹配@结尾的命令块内也能工作987654329@ 不使用延迟的环境变量扩展。

    然后运行cmd /? 并从第一页的顶部到最后一页的底部仔细完整地再次阅读输出帮助。解释说包含空格的文件名(或任何其他参数字符串)必须将这些字符之一 &()[]{}^=;!'+,`~ 括在 " 中,以将这些字符解释为参数字符串的文字字符。

    另请阅读How does the Windows Command Interpreter (CMD.EXE) parse scripts?

    因此,命令行set /a npcdef=(%npchp%*5)/100 应使用以下符号之一编写:

    set /A npcdef=npchp*5/100
    set /A npcdef=npchp * 5 / 100
    set /A "npcdef=(npchp*5)/100"
    set /A npcdef=(npchp*5^)/100
    

    插入符号^ 转义下一个字符以解释为文字字符,但下一个字符是%,必须使用% 进行转义。

    在编写输出空行的批处理文件时,还应考虑在 DosTips 论坛主题 ECHO. FAILS to give text or blank line - Instead use ECHO/ 上发布的建议。

    批处理文件主要改进了更改IF条件以完全避免使用命令块。

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    %SystemRoot%\System32\mode.com con cols=110 lines=32
    
    set npctier=0
    set "npctype=Wooden Dummy"
    
    :randomnpc
    if %npctier% NEQ 0 goto CombatChoice
    set /A npclvl=%random% %% 5 + 1
    set /A npchp=npclvl*100
    set npcdmg=0
    set /A npcdef=npchp*5/100
    set /A npcxp=npclvl*100
    
    :CombatChoice
    echo/
    echo You see %npctype% level %npclvl%.
    echo/
    echo The %npctype%'s health: %npchp% HP
    echo/
    
    endlocal
    

    另请参阅Why is no string output with 'echo %var%' after using 'set var = text' on command line? 它包含一些关于如何使用命令 SET 的提示,而该命令的帮助/文档中没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多