batch-file - IF语句使用延迟扩展?

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

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

最佳答案

正如 Stephan 在他的评论中所说 - 在扩展 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!
)
仅当 rand 大于或等于 chance 时,

var 才会递增。如果 rand 小于 chance,则会出现除以 0 的错误(通过 stderr 的重定向隐藏),并且 SET/A 不会继续进行。

关于batch-file - IF语句使用延迟扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33975342/

相关文章:

R Ifelse 语句因 NA 而不起作用

batch-file - 用于创建备份文件夹的批处理脚本。仅新文件和修改过的文件

windows - 检查更改目录命令是否在批处理文件窗口中正确执行

Java:树的创建

javascript - 循环遍历数字和字母数组并仅提取数字?

linux - 测试字符串在 Bash 中是否有非空白字符

batch-file - 如何使用 `Batch` 移动重音文件?

string - 用符号将变量分成不同的部分

javascript - 比较两个数组以寻找匹配值的 for 循环

c# - 运算符 ||不能应用于类型 bool 和 string/string 和 string