IF声明使用延迟扩展?

时间:2015-11-28 19:11:53

标签: batch-file for-loop if-statement

我有一段看起来像这样的代码(启用延迟扩展):

    for /l %%y in (1,1,%variable%) do (
     set /a rand=!random! * 100 / 32768 + 1
     echo !rand!
     if !rand! GEQ %chance% (
      set /a var=%var%+%varx%
     )
    )

echo !rand!部分显示数字,但if !rand! GEQ %chance%只是看到了!兰德!作为字符串,而不是它的价值。所以即使!兰德!大于%几率%它仍会跳过命令。

奇怪的部分是无论在循环结束时!rand!大于%chance%多少次,%varx%只增加IF一次。这里应该做些什么,以便!rand!语句看到index.html的价值?

1 个答案:

答案 0 :(得分:3)

正如斯蒂芬在评论中所说 - 在扩展randomrand时,你知道在循环中使用延迟扩展。为什么不在var使用它? %var%的值在循环中是恒定的。您需要!var!才能看到每次迭代时存在的动态值。

for /l %%y in (1,1,%variable%) do (
  set /a rand=!random! * 100 / 32768 + 1
  echo !rand!
  if !rand! GEQ %chance% (
    set /a var=!var!+%varx%
  )
)

但还有另一种解决方案。 SET / A知道如何在没有%!的情况下自行扩展变量。请注意,仍需要!random!,因为random不是真正的环境变量。

for /l %%y in (1,1,%variable%) do (
  set /a rand=!random! * 100 / 32768 + 1
  echo !rand!
  if !rand! GEQ %chance% (
    set /a var=var+varx
  )
)

或者您可以使用+=运算符

for /l %%y in (1,1,%variable%) do (
  set /a rand=!random! * 100 / 32768 + 1
  echo !rand!
  if !rand! GEQ %chance% (
    set /a var+=varx
  )
)

如果您想获得最佳性能,您可以在一个SET / A内完成所有计算,而无需任何IF。但这非常极端,而且不太可读:

for /l %%y in (1,1,%variable%) do (
  2>nul set /a "rand=!random!*100/32768+1, 1/(rand/chance), var+=varx"
  echo !rand!
)

var仅在rand大于或等于chance时递增。如果rand小于chance,则会得到除以0错误(由stderr重定向隐藏),并且SET / A不再继续。