Неработающий SET в FOR / L в пакетном скрипте - PullRequest
0 голосов
/ 23 февраля 2012

p Кто-нибудь может объяснить, почему SET ничего не делает в следующем коде?:

ECHO OFF
FOR /L %%b IN (-1,1,1) DO (
SET /A _lat=%%b
ECHO variable lat: %_lat%
ECHO variable b: %%b
ECHO:
)

вывод:

variable lat:
variable b: -1

variable lat:
variable b: 0

variable lat:
variable b: 1

Я пробовал SET без / A, конечно, я пытался этов FOR, где переменная %% b была строкой из файла, и она работала нормально, но просто здесь, когда переменная %% b является изменяющимся числом, она не работает.

Если у вас есть какие-либо предложения, пожалуйста, сообщитемне.Конечно, я могу использовать только %% b, чтобы отобразить то, что я хочу, но, поскольку это является частью более крупного сценария, чтобы сделать его более читабельным, я бы хотел, но полями утверждать переменную.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Вам нужно использовать ENABLEDELAYEDEXPANSION.Попробуйте следующее:

setlocal ENABLEDELAYEDEXPANSION

echo off
for /L %%b in (-1,1,1) do (
    set /A _lat=%%b
    echo variable lat: !_lat!
    echo variable b: %%b
    echo:
)
1 голос
/ 23 февраля 2012

Посмотрите на вывод SET /? в консоли.Вам нужно включить и использовать отложенное расширение переменной среды , чтобы это работало.Вот соответствующий фрагмент из help set:

Наконец, добавлена ​​поддержка отложенного расширения переменных среды.Эта поддержка всегда отключена по умолчанию, но ее можно включить / отключить с помощью переключателя командной строки / V к CMD.EXE.См. CMD /?

Задержка раскрытия переменных среды полезна для преодоления ограничений текущего раскрытия, которое происходит при чтении строки текста, а не при ее выполнении.В следующем примере демонстрируется проблема с немедленным расширением переменной:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)

никогда не будет отображать сообщение, поскольку% VAR% в операторах ОБА IF заменяется при чтении первого оператора IF, поскольку оно логически включает в себятело IF, которое является составным утверждением.Таким образом, IF внутри составного оператора действительно сравнивает «до» с «после», которое никогда не будет равным.Точно так же следующий пример не будет работать должным образом:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%

в том смысле, что он НЕ будет создавать список файлов в текущем каталоге, а вместо этого просто установит для переменной LIST последний найденный файл.Опять же, это связано с тем, что% LIST% раскрывается только один раз при чтении оператора FOR, и в это время переменная LIST пуста.Таким образом, фактический цикл FOR, который мы выполняем:

for %i in (*) do set LIST= %i

, который просто устанавливает LIST для последнего найденного файла.

Отсроченное расширение переменной среды позволяет использовать другой символ (восклицательный знакmark) для расширения переменных среды во время выполнения.Если расширение отложенной переменной включено, приведенные выше примеры можно записать следующим образом, чтобы они работали как задумано:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...