Как правило, if errorlevel ...
строки должны быть в порядке убывания.sst
уже указал причину:
Условие, если число уровня ошибки будет выполнено, когда значение уровня ошибки равно или больше, чем число.Таким образом, выполнено условие, если errorlevel 2 также будет удовлетворен, если errorlevel 1
Хотя в этом особом случае проще просто инвертировать этот порядок:
choice /c 12 /n
if errorlevel 1 set "p.sex=m"
if errorlevel 2 set "p.sex=f"
Когда вы нажимаете 1
, первый if
выполняется, а переменная установлена на m
.Второй не выполняется, поэтому переменная остается m
.
Когда вы нажимаете 2
, выполняется первый if
и переменная устанавливается на m
.Второй также выполняется, поэтому переменная изменяется на f
Примечание: я изменил синтаксис set
на рекомендованную форму, чтобы избежать пробелов (трудно обнаружить в коде, но это может привести кнеожиданное поведение (и некоторая головная боль при устранении неполадок) в других частях кода)
Еще одно предложение: для читабельности вы можете заменить
if %p.race%==altmer if %p.sex%==m
на
if "%p.race%-%p.sex%"=="altmer-m"
и set /a
может установить несколько переменных, поэтому вы можете сократить свой код с помощью:
if "%p.race%-%p.sex%"=="altmer-m" set /a p.strength=30, p.intelligence=50
и - когда у мужчин и женщин одинаковые свойства - вы можете сделать их в одной строке (хотя могут быть причиныне делать этого - например, оставить возможность изменить свойства позже, не слишком сильно изменяя код):
if "%p.race%"=="altmer" set /a p.strength=30, p.intelligence=50