2015-11-28 133 views
2

我有一段代碼,看起來像這樣(延遲擴展啓用):IF語句使用延遲擴展?

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% var只增加%varx%一次。這裏應該做些什麼,以便IF聲明看到!rand!的價值?

+0

你似乎知道延遲擴展以及如何使用它。也可以用'!var!'來代替'%var%' – Stephan

+0

它現在似乎正在工作。非常感謝!所以在一個循環中,我應該在IF和SET中使用感嘆號? –

+0

請注意''DOS'是80年代/ 90年代的操作系統!請改用標籤Windows。 – SteveFest

回答

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不會繼續進行。