2

У меня есть следующий код:

echo off
set n=11
set m=12
set /a nme=3
set /a mdiff=nme-1
pause
if %n% NEQ %m% (
    if %mdiff% LEQ 3 (
        for /l %%C in (1,1,3) do (
            if %%C EQU 1 (
                set mon=Apr
            )
set num=1%mon%
        )
    )
)
echo %num%
pause

который дает мне вывод 1 вместо 1 1Apr . Однако, когда я set num=1%mon% вне всех циклов if и for, это дает правильный результат.

Пожалуйста, объясните мне, что здесь произошло и как получить правильный результат внутри циклов.

Кроме того, какова максимальная глубина, if и for уровней?

1 ответ1

3

Что вам нужно сделать, это поместить SetLocal EnableDelayedExpansion вверху вашего скрипта и использовать !вокруг ваших переменных.

Задержка расширения приведет к тому, что переменные будут расширяться во время выполнения, а не во время анализа, эта опция включается командой SETLOCAL . Когда действует отложенное расширение, на переменные можно ссылаться с помощью !variable_name! (в дополнение к обычному %variable_name% )

Задержка раскрытия переменных часто полезна при работе с циклами FOR , обычно весь цикл FOR оценивается как одна команда, даже если он занимает несколько строк пакетного сценария.

По сути, цикл for анализируется один раз. Каждая итерация цикла выполняется инструкциями get. Включив эту опцию, переменные могут изменяться при выполнении без повторного анализа, то есть внутри цикла.

@echo off
SetLocal EnableDelayedExpansion

set n=11
set m=12
set /a nme=3
set /a mdiff=nme-1
pause
if %n% NEQ %m% (
    if %mdiff% LEQ 3 (
        for /l %%C in (1,1,3) do (
            if %%C EQU 1 (
                set mon=Apr
                set num=1!mon!
            )
        )
    )
)
echo %num%
pause

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .