2013-12-22 7 views
0

Так что в этом коде есть какая-то проблема, возможно, это лишь некоторая ошибка пунктуации, которую я еще не заметил, но по какой-то причине я не могу ее найти.Batch Program Issue if-then Math

Я читал, что это как сделать цикл с Do, а затем количество раз, в данном случае '%dmg%', скажите, если это было неверно.

У меня есть части, которые определяют переменные; set dmgt=0set /a wl=1000*%upts%/%epts% и у меня есть все остальные.

Используя команду pause, я обнаружил, что это проблема;

if %upts%*%utroop% LEQ %epts%*%etroopt% (goto fail 
) else (set /a dmg=%wl%*%etroop%/1000 
    set /a dmgt=%dmg%+%dmgt% 
do %dmg% 
SET /A type=%RANDOM% * 3/32768 + 1 
if %type% == 1 (if %snip% GEQ 1 (set /a dmg=%dmg%-1 
     set /a snip=%snip%-1 
    ) 
) 
if %type% == 2 (if %mgs% GEQ 1 (set /a dmg=%dmg%-2 
     set /a mgs=%mgs%-1 
    ) 
) 
if %type% == 3 (if %rif% GEQ 1 (set /a dmg=%dmg%-1 
     set /a rif=%rif%-1 
    ) 
) 
enddo 
) 
+2

Вы можете найти 'ENABLEDELAYEDEXPANSION' то, что вы ищете. (Я не могу проверить, работает ли Linux сегодня). Проверьте это: http://ss64.com/nt/delayedexpansion.html – GregHNZ

+0

О, это не полный код наверху. У меня есть «@echo off» и «ENABLEDELAYEDEXPANSION». – Andenrx

ответ

0

if %upts%*%utroop% LEQ %epts%*%etroopt% не вычисляет значение каждой стороны, она натягивает вместе the contants of upts * the contents of utroop и сравнивает эту строку с ОРЗ. Вам нужно явно вычислить два значения в переменных, используя SET.

Вашего пункт ELSE вызывает «блок» о том, что есть, все содержимое в скобках серии заявлений до закрытия ) следующее enddo. Партия анализирует инструкцию от IF до закрывающей круглой скобки блока ELSE, заменяет любой %var% значением PARSE-TIME var и . THEN выполняет результат. Следовательно, TYPE останется неизменным для логики внутри блока.

Вам необходимо вызвать режим delayedexpansion и использовать !var! для доступа к значению RUN-TIME var. Это делается с SETLOCAL ENABLEDELAYEDEXPANSION заявления, как правило, вставленного после открытия @echo off в начале партии (отсюда поворот delayedexpansion и !var! установки ПО в течение всего срока действия пакета)

На самом деле, нет никакой необходимости в ELSE пункте как у вас есть, потому что вы GOTO ярлык в настоящей части. Это может упростить ваш код.

И, наконец, нет DO/ENDDO объект в партии - или, по крайней мере, не в этой форме. Я предполагаю, что вы намереваетесь сделать промежуточный код %dmg% раз. Вы можете добиться этого с помощью

for /L %%z in (1,1,%dmg%) do (
intervening code 
) 

где метапеременная %%z будет увеличиваться с первым элементом в скобках последнего шага второй. %%z может быть любой буквой, но является одним из немногих случаев в партии, который IS с учетом регистра.

+0

Это была часть 'Else', которая испортила это. Подстановка части 'if% upts% *% utroop%' для переменной не могла повредить. И я действительно не думал, что часть 'do' /' enddo' будет работать. – Andenrx

 Смежные вопросы

  • Нет связанных вопросов^_^