%i%
не имеет значения.Вы намеревались использовать %%i
?
Чтобы уточнить, что cmd
видит здесь:
if EQU 8 goto lvl8
if EQU 3 goto lvl35
if EQU 2 (goto lvl3) else goto lvls
, что явно является синтаксической ошибкой.
Хорошо, после вашего редактирования, есть еще несколько проблем.Если вы используете goto
, вы, очевидно, выйдете из цикла for
.Таким образом, после того, как goto
%%i
не имеет значения, либо и цикл запускается только один раз.
Тогда есть способ использования goto
с;goto
- это переход к определенной строке кода.После этого выполнение программы продолжается в обычном режиме, и поэтому, если вы перейдете к lvl8
, вы также запустите все последующие строки, даже те, которые идут после :lvl35
и :lvl3
или :lvls
.После каждого перехода, к которому вы переходите, вам нужно будет включить явный переход в конец цикла, чтобы пропустить ненужные строки.Но это почти не относится к делу, поскольку вы не можете использовать goto
в цикле for
, как упоминалось выше.
Поэтому первое, что вы должны сделать, это избавиться от goto
и вместо этого использовать структурированныйпрограммирование.if
тоже может принять блок.Затем вы выводите %%i
слишком часто, что тоже можно легко исправить.
Теперь это выглядит следующим образом:
@echo off
setlocal enabledelayedexpansion
for %%i in (8 7 6 5 4 3 2) do (
echo %%i
if %%i EQU 8 (
set str1=8
set str2=16
) else if %%i EQU 3 (
set str1=3.5
set str2=4
) else if %%i EQU 2 (
set str1=3
set str2=3.5
) else (
set str1=%%i
set /A str2=%%i+1
)
rem echo %%i
rem echo.!str!
echo.!str1!
echo.!str2!
)
endlocal
Обратите внимание, что каждый if
также имеет else
, чтобы не использовать последний else
для всех номеров, кроме 2
.Вывод теперь правильный.Код можно найти в моем хранилище SVN тоже.