【问题标题】:IF statement using delayed expansion?使用延迟扩展的 IF 语句?
【发布时间】:2016-03-02 17:10:52
【问题描述】:

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

    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!作为一个字符串,而不是它的值。所以即使!rand!大于 %chance% 它仍然会跳过命令。

奇怪的部分是无论!rand! 比%chance% 大多少次,循环结束时var 只增加一次%varx%。这里应该怎么做才能让IF 语句看到!rand! 的值?

【问题讨论】:

  • 您似乎知道延迟扩展以及如何使用它。也可以为!var! 而不是%var% 这样做
  • 它现在似乎可以工作了。太感谢了!所以在循环中我应该在 IF 和 SET 中使用感叹号?
  • 请注意DOS是80/90年代的操作系统!请改用标签 Windows。

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


【解决方案1】:

正如 Stephan 在他的评论中所说 - 您知道在扩展 random 和 rand 时在循环中使用延迟扩展。为什么不将它与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 不会继续进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2018-03-06
    相关资源
    最近更新 更多