
Ich versuche, diesen Code zu schreiben:
If %dropmode%==on (
If %drop% LEQ %potiondrop% (
set /a potion=%potion%+1
)
If %drop2% LEQ %potiondrop% (
set /a potion=%potion%+1
)
)
Die Bedingung „if %drop2% LEQ %potiondrop%“ funktioniert also nicht, aber „if %drop% LEQ %potiondrop%“ funktioniert. Was ist zu tun?
Antwort1
Das Problem ist, dass die Windows-Eingabeaufforderung / der Befehlszeileninterpreter (CLI), bekannt als CMD.EXE, einen Fehler aufweist (ich bin sicher, Microsoft denkt, dass es sich um eine Funktion handelt), bei dem beim Lesen einer Blockkonstruktion wie IF … ( … )
oder einer Schleife alle Variablen FOR
interpretiert werden%variable_name%
sofort, bevor die Schleife oder der Block ausgeführt wird. Wenn in Ihrem Beispiel potion
0 ist, wenn Sie den If %dropmode%==on ( … )
Block betreten, dann werden alle Vorkommen von %potion%
innerhalb dieses Blocks als 0 ausgewertet, und daher werden beide Ihrer set
Anweisungen als verarbeitet set /a potion=0+1
, auch wenn Sie innerhalb des Blocks Änderungen vornehmen potion
. Dies ist aus der Bildschirmausgabe ersichtlich, die Sie gemeldet haben.
Die Lösung besteht darin, CMD anzuweisen, die Erweiterung von Variablen zum richtigen Zeitpunkt zuzulassen, wenn die auf sie verweisenden Anweisungen ausgeführt werden. Dies erreichen Sie durch Hinzufügen
setlocal enabledelayedexpansion
irgendwo am Anfang Ihrer Batchdatei und ändern Sie Ihren Zählcode so, dass er aussieht wie
set /a potion=!potion!+1
Verwenden Sie das Formular, um die verzögerte Erweiterung zu aktivieren. Weitere Informationen finden Sie unter und .!variable_name!
SET /?
SETLOCAL /?
%
PS Eine andere Lösung besteht darin, einfach die Zeichen aus den Anweisungen zu entfernen set
und zu sagen:
set /a potion=potion+1