批次檔。 if 語句中的 if 語句

批次檔。 if 語句中的 if 語句

我正在嘗試編寫這段程式碼:

If %dropmode%==on (
If %drop% LEQ %potiondrop% (
set /a potion=%potion%+1
)
If %drop2% LEQ %potiondrop% (
set /a potion=%potion%+1
)
)

因此,條件「if %drop2% LEQ %potiondrop%」不起作用,但「if %drop% LEQ %potiondrop%」起作用。怎麼辦?

答案1

問題是 Windows 命令提示字元/命令列解釋器 (CLI)(稱為 CMD.EXE)有一個錯誤(嗯,我確信 Microsoft 認為這是一個功能),其中,當它讀取類似IF … ( … )或一個FOR循環,它解釋所有%variable_name%變數立即地,在執行循環或區塊之前。在您的範例中,potion當您輸入區塊時 if 為 0 If %dropmode%==on ( … ),則該區塊內所有出現的 的%potion%計算結果都為 0,因此您的兩個set語句都被處理為set /a potion=0+1,即使您potion在區塊內進行了更改。從您報告的螢幕輸出中可以明顯看出這一點。

修復方法是告訴 CMD 允許在執行引用變數的語句時在正確的時間擴展變數。您可以透過添加來做到這一點

setlocal enabledelayedexpansion

靠近批次檔開頭的某個位置,並將計數程式碼變更為如下所示

    set /a potion=!potion!+1

使用表單啟動延遲擴充。請參閱和了解更多資訊。!variable_name!SET /?SETLOCAL /?


%PS 另一種解決方案是簡單地從語句中刪除字元set並說

set /a potion=potion+1

相關內容