Batch file 调用IF语句|批处理
错误代码:Batch file 调用IF语句|批处理,batch-file,Batch File,错误代码: If was unexpected at this time 代码为每个玩家设置统计信息,然后调用函数根据统计信息和其他变量确定伤害量 我要做的是调用一个包含两个IF语句的函数 例如: @echo off set /a level=5 set /a opponentLevel=5 set /a movePower=50 set moveType=physical goto player :damageCalculator if %moveType%==physical (
If was unexpected at this time
代码为每个玩家设置统计信息,然后调用函数根据统计信息和其他变量确定伤害量
我要做的是调用一个包含两个IF语句的函数例如:
@echo off
set /a level=5
set /a opponentLevel=5
set /a movePower=50
set moveType=physical
goto player
:damageCalculator
if %moveType%==physical (
pause
set /a damage=(((( 2 * %level% / 5 + 2) * %attackStat% * %movePower% / %opponentDefenceStat%) / 50) + 2)
set /a opponentHealth-=%damage%
) else if %moveType%==special (
set /a damage=(((( 2 * %level% / 5 + 2) * %spAttackStat% * %movePower% / %opponentSpDefenceStat%) / 50) + 2)
set /a opponentHealth-=%damage%
)
goto :eof
:player
set type=fire
set/a health=19
set/a attackStat=10
set/a defenceStat=10
set/a spAttackStat=11
set/a spDefenceStat=10
set/a speedStat=12
:opponent
set /a opponentHealth=18
set /a opponentAttackStat=10
set /a opponentDefenceStat=9
set /a opponentSpAttackStat=8
set /a opponentSpDefenceStat=9
set /a opponentSpeedStat=13
:attack
pause
cls
call :damageCalculator
echo It did %damage% Damage!!
pause>nul
这只是batch不能做的事情之一吗?根据编辑的问题更新
您的脚本有一些小问题。首先,我要指出,在试图找出问题的原因时,rem
out@echo off
通常很有帮助。在本例中这样做表明导致错误的行是您的第一行set/a
if
语句失败的原因是数学中的括号被视为代码块的结尾。一旦遇到…5+2)
的右括号,批处理解释器就会将其视为if
语句的结尾,因此当行中有更多内容时会感到困惑。您需要引用您的set/a
语句来防止出现这种情况
set/a“伤害=((2*level/5+2)*攻击属性*movePower/opponentDefenceStat)/50)+2)
看看我是如何设置/a“variable=value”的?您也可以使用插入符号来转义右括号,例如^)
,但是引用“var=value”
更容易阅读。引号将内容保留在命令的上下文中。他们基本上是说,“这是一个单独的标记。它是set
命令的一个独特部分,而不是整个代码块。”另外,您还可以看到%
符号不需要在set/a
命令中检索变量值。整洁,嗯
你还有一个问题。由于您在检索时将%damage%
变量设置在同一个附加代码块中,因此对%damage%
的评估将太早。您可以设置本地enabledelayedexpansion
并将其检索为!破坏代码>,这肯定会奏效。但有一个更简单的解决办法。只需将它放在if
语句之外。不管移动类型是物理的还是特殊的,你都在做set/a opponentHealth-=damage
,对吧
:损坏计算器
如果“%moveType%”==“物理”(
设置/a“伤害=((2*等级/5+2)*攻击状态*movePower/opponentDefenceStat)/50)+2)
)如果“%moveType%”为“特殊”,则为else(
设置/a“伤害=(((2*等级/5+2)*spAttackStat*movePower/opponentSpDefenceStat)/50)+2)
)
设置/a对手第十次-=伤害
后藤:eof
但是,您仍然应该在@echo off
下方包含setlocal
,以避免在脚本范围之外使用没有任何意义的变量破坏您的环境
这是另一个提示。您可以在一个set/a
行中组合多个语句
之前:
set/a级别=5
设置/对立面标高=5
设置/a移动功率=50
设置“移动类型=物理”
之后:
set/a级别=5,对手级别=5,移动功率=50
设置“移动类型=物理”
原始答案
将第二个if
更改为else if
或在其前面添加回车符(在前面的括号之后)。另外,将goto:EOF
移动到右括号后的下一行
对此的解释是,cmd解释器将附加代码块视为单个命令。所以在本质上
if[真实条件](
行动
)第二命令
被评估为
如果[真实条件](操作)第二个命令
这会导致一个错误,因为第一个命令(如果)和第二个命令之间没有换行符或其他分隔符。下面是一个有效复合命令的示例:
@echo off&setlocal
复合指挥需要:
- 无条件AND(
&
--右侧始终在左侧之后执行)
- 示例:
endlocal&goto:EOF
- 逻辑AND(
&&
--仅当前面的命令退出零时,右侧才执行)
- 示例:
find/i“text”“textfile.txt”>NUL&&echo text被找到
- 管道(
|
——使右侧的命令对左侧命令生成的输出执行某些操作)
- 示例:
dir/s/b |更多
- 逻辑OR(
|
--仅当前面的命令退出非零时,才会执行右侧)
- 示例:
tasklist | find/i“iexplore.exe”>NUL | | echo Internet Explorer未运行
。。。或者如果是if
语句,else
如果条件1(
行动1
)否则,如果条件2(
行动2
)否则(
行动3
)
或者,如果要检查两个条件是否为真:
if%var%leq 10 if%var%geq 5(
echo变量介于5和10之间。
)
当然,您不必使用复合语句。一个函数没有理由不能有多个非复合的if
语句
:fn
如果“%~1”==“鱼”(回声Bloop.)
如果“%~1”=“猫”(回声喵喵。)
如果“%~1”==“狗”(回音Grrrr.)
后藤:EOF
。。。是完全有效的。将第二个if
更改为else if
或在前面的括号后面添加回车符。另外,将你的goto:EOF
移到右括号后的下一行。我知道一个很好的方法。就是这样@rojoI将其作为一个答案,并对其进行了更详尽的解释,以防有所帮助。Batch debugging pro提示:如果您对错误发生的位置感到困惑,请从批处理文件中删除@echo off
。您正在抑制调试信息。这适用于我的示例代码