我有一段代码,看起来像这样(启用了延迟扩展):
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 在他的评论中所说 - 在扩展 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!
)
仅当 rand
大于或等于 chance
时,var
才会递增。如果 rand
小于 chance
,则会出现除以 0 的错误(通过 stderr 的重定向隐藏),并且 SET/A 不会继续进行。
关于batch-file - IF语句使用延迟扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33975342/