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
。您正在抑制调试信息。这适用于我的示例代码