Batchdatei. If-Anweisungen in if-Anweisungen

Batchdatei. If-Anweisungen in if-Anweisungen

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 FORinterpretiert werden%variable_name%sofort, bevor die Schleife oder der Block ausgeführt wird. Wenn in Ihrem Beispiel potion0 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 setAnweisungen 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 setund zu sagen:

set /a potion=potion+1

verwandte Informationen