Windows 批处理文件错误"/此时100是出乎意料的”;

Windows 批处理文件错误"/此时100是出乎意料的”;,windows,if-statement,batch-file,cmd,syntax,Windows,If Statement,Batch File,Cmd,Syntax,我用批处理脚本制作了一个有趣的游戏,但在这段代码中我有一条错误消息“/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 se

我用批处理脚本制作了一个有趣的游戏,但在这段代码中我有一条错误消息“/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

我建议首先打开一个,运行
set/?
,然后从头到尾仔细阅读输出帮助。有人解释说:

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

因此,可以只编写
set/A npchp=npclvl*100
,因为算术表达式中的
npclvl
被解释为环境变量的名称,并且命令行即使在以
开头的命令块中(
以匹配
结尾),也可以工作
不使用延迟环境变量扩展

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

请同时阅读

因此,命令行
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论坛主题上发布的建议

批处理文件的主要改进是更改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

另请参见,其中包含有关如何使用此命令的帮助/文档中未编写的命令集的一些提示。

如果您希望保持相同的结构,则最好使用以下方法:

@Echo关闭
setLocalEnableExtensions
%__APPDIR_uu%mode.com 110,32
设置“npctier=0”
:randomnpc
如果%npctier%Equ 0(
设置“npctype=木制假人”
设置“npcdmg=0”
设置/A“npclvl=(%RANDOM%%%5)+1”
设置/A“npchp=npclvl*100,npcdef=npclvl*5,npcxp=npchp”
)
:combatchoice
回音=
回显您看到的%npctype%级别%npclvl%。
回音=
回显%npctype%的运行状况:%npchp%HP
回音=
后藤大街

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

在您过于沉迷于创建一个重复代码的冗长脚本之前,我认为值得向您介绍批处理宏

批处理中的宏是分配给变量的命令或命令块,通过使用For循环和If/Else条件,可用于捕获允许变量用作函数的参数

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

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

@echo关闭
模式con cols=110行=32行
(设置\n=^^^
%=宏换行符DNR=%
)
(左前)=^
%=换行DNR=%)
rem示例1:npc生成;固定公式宏
rem使用:%npc{generic}%{npc name/type}{npc max level}{npc乘数}{伤害值或公式}
如果%%n==2(%\n%
对于/F“Tokens=1,2,3,4 Delims={}”%%G in(“!Params!”)Do(%\n%
设置“npctype=%%G”%\n%
设置/a“npclvl=!random!%%%H+1”%\n%
设置/a“npchp=!npclvl!*%%I”%\n%
设置/a“npcdmg=%%J”%\n%
设置/a“npcdef=(!npchp!*%%H)/%%I”%\n%
设置/a“npcxp=!npclvl!*%%I”%\n%
回声/敌人:!npctype!!LF!等级:!npclvl!!LF!HP:!npchp!!LF!伤害:!npcdmg!!LF!防御:!npcdef!!LF!XP:!npcxp!!LF!%\n%
)%\n%
)Else设置参数=
rem示例2:npc生成;提供的公式宏
rem用法:%npc{boss}%{npc名称/类型}{等级值或公式}{hp值或公式}{伤害值或公式}{防御值或公式}{xp值或公式}
如果%%n==2(%\n%
对于/F“Tokens=1,2,3,4,5,6 Delims={}”%%G in(“!Params!”)Do(%\n%
设置“npctype=%%G”%\n%
设置/a“npclvl=%%H”%\n%
设置/a“npchp=%%I”%\n%
设置/a“npcdmg=%%J”%\n%
设置/a“npcdef=%%K”%\n%
设置/a“npcxp=%%L”%\n%
回声/敌人:!npctype!!LF!等级:!npclvl!!LF!HP:!npchp!!LF!伤害:!npcdmg!!LF!防御:!npcdef!!LF!XP:!npcxp!!LF!%\n%
)%\n%
)Else设置参数=
rem在宏定义后启用延迟扩展
setlocal enableextensions enabledelayedexpansion
:randomnpc
%npc{generic}%{木制假人}{5}{100}{0}
暂停
%npc{boss}%{Dragon}{!随机!%%10+10}{npclvl*200}{npchp/20}{npchp/(npclvl/2)}{npclvl*150}
端部
后藤:Eof

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