【问题标题】:Batch Program Issue if-then Math批处理程序问题 if-then 数学
【发布时间】:2013-12-22 05:18:09
【问题描述】:

所以这段代码有一些问题,可能只是一些我还没有注意到的标点错误,但由于某种原因我找不到它。

我读到这是如何使用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
)

【问题讨论】:

  • 您可能会发现ENABLEDELAYEDEXPANSION 正是您要找的东西。 (我无法验证,今天正在运行 Linux)。检查这个:ss64.com/nt/delayedexpansion.html
  • 哦,这不是顶部的完整代码,我有 @echo offENABLEDELAYEDEXPANSION 的东西。

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


【解决方案1】:

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

您的ELSE 子句调用“块语句”,即括号内的语句系列的全部内容,直到enddo 之后的结束)。批处理解析从IFELSE 块的右括号的语句,用var 的PARSE-TIME 值替换任何%var%,然后THEN 执行结果。因此,TYPE 在块内的逻辑中看起来没有变化。

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

实际上,您不需要 ELSE 子句,因为您 GOTO 是真实部分中的标签。这可能会简化您的代码。

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

for /L %%z in (1,1,%dmg%) do (
 intervening code
)

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

【讨论】:

  • Else 部分搞砸了。用if %upts%*%utroop% 部分代替变量不会有什么坏处。而且我真的不认为do/enddo 部分会真正起作用。
猜你喜欢
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多