Условие «если» в командном файле - PullRequest
0 голосов
/ 02 декабря 2011

У меня проблемы с получением желаемого результата в командном файле cmd. Мне нужно распечатать результат в указанном ниже формате

@echo off
setlocal enabledelayedexpansion
for %%i in (8 7 6 5 4 3 2) do (

echo %%i
if %%i EQU 8 goto lvl8
if %%i EQU 3 goto lvl35
if %%i EQU 2 (goto lvl3) else goto lvls

:lvl8
set str1=8
set str2=16

:lvl35
set str1=3.5
set str2=4

:lvl3
set str1=3
set str2=3.5

:lvls
set str1=%%i

set /A str2=%%i+1

echo %%i
rem echo.!str!
echo.!str1!
echo.!str2!
)
endlocal

Ожидаемые результаты

8
8
16
7
7
8
6
6
7
5
5
6
4
4
5
3
3.5
4
2
3
3.5

Прямо сейчас я получаю следующее:

8
Missing operand
%i

%i
3.5

РЕДАКТИРОВАТЬ: обновил вопрос выше в соответствии с решением Джои.

1 Ответ

3 голосов
/ 02 декабря 2011

%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 тоже.

...