批处理程序问题if-then Math

时间:2013-12-22 05:18:10

标签: variables batch-file while-loop do-loops

所以在这段代码中存在一些问题,它可能只是一些标点符号错误,我还没有注意到,但由于某些原因我无法找到它。

我读到这是如何使用Do进行循环,然后是次数,在这种情况下为“%dmg%”,告诉我这是不是真的。

我确实有定义变量的部分; set dmgt=0 set /a wl=1000*%upts%/%epts%我确实已经设置了所有其他内容。

使用pause命令我发现这是问题;

if %upts%*%utroop% LEQ %epts%*%etroopt% ( goto fail
) else ( set /a dmg=%wl%*%etroop%/1000
    set /a dmgt=%dmg%+%dmgt%
do %dmg%
SET /A type=%RANDOM% * 3 / 32768 + 1
if %type% == 1 ( if %snip% GEQ 1 ( set /a dmg=%dmg%-1
        set /a snip=%snip%-1
    )
)
if %type% == 2 ( if %mgs% GEQ 1 ( set /a dmg=%dmg%-2
        set /a mgs=%mgs%-1
    )
)
if %type% == 3 ( if %rif% GEQ 1 ( set /a dmg=%dmg%-1
        set /a rif=%rif%-1
    )
)
enddo
)

1 个答案:

答案 0 :(得分:0)

if %upts%*%utroop% LEQ %epts%*%etroopt%不计算每一方的值,它将the contants of upts * the contents of utroop串起来并将该字符串与RHS进行比较。您需要使用SET将这两个值显式计算为变量。

您的ELSE子句调用“块语句”,即括号系列语句的ENTIRE内容,直到)后的结束enddo。批处理将语句从IF解析到ELSE块的右括号,替换PARSE-TIME值为%var% THEN的任何var 执行结果。因此,TYPE对于块内的逻辑将保持不变。

您需要调用delayedexpansion模式并使用!var!访问var的RUN-TIME值。这是通过SETLOCAL ENABLEDELAYEDEXPANSION语句完成的,通常在批处理开始时打开@echo off之后插入(因此在整个批处理期间将delayedexpansion和!var!工具打开)< / p>

实际上,你不需要ELSE条款,因为你GOTO是真实部分的标签。这可以简化您的代码。

最后,批处理中没有DO/ENDDO设施 - 或者至少不是那种形式。我假设您打算进行干预代码%dmg%次。您可以使用

实现此目的
for /L %%z in (1,1,%dmg%) do (
 intervening code
)

其中,元变量%%z将从括号中的第一个元素递增到第二个元素的最后一个元素。 %%z可以是任何字母,但是批量中极少数情况之一 IS 区分大小写。