#batch-file #for-loop
#пакетный файл #для цикла
Вопрос:
Я использую массив в своем цикле for и пытаюсь присвоить значение переменной, когда каждый цикл времени обрабатывает значение массива. но когда я присваиваю значение своей переменной, результат получается не таким, как ожидалось.
Вот что я пытаюсь сделать:
@echo off
setlocal enabledelayedexpansion
SET var[0]=a
SET var[1]=b
SET var[2]=c
SET var[3]=d
for %%a in (0,1,2,3) do (
SET name=%var[%%a]%
ECHO %name%
)
но результат показывает последнее значение массива, которое равно ‘d’. Я не хочу использовать ECHO !name!
. И ожидая вывода, как показано ниже, с %
a
b
c
d
Комментарии:
1. Не уверен в причине, по которой вы не хотите использовать
delayedexpansion
, но если вы действительно отказываетесь ее использовать, отключите delayedexpansion, а затем используйтеcall echo %%name%%
, что уродливо и имеет свои недостатки.
Ответ №1:
Обычно это отображается ECHO is off.
, потому %name%
что не было объявлено ранее. Допустим, вы установили значение по умолчанию на null
for %name%
, тогда вывод будет null
вместо a
, b
, c
и d
. Это потому %name%
, что было объявлено вне цикла.
Что здесь происходит? echo %name%
Внутренний блок кода %name%
сначала получит переменную перед ее запуском, и, следовательно, ваш код внутри блока кода после анализа будет:
(
set name=
rem "%var[%" = "" and "%a]%" also = ""
echo
rem %name% wasn't here, because it's parsed before you run it.
)
!
Символ является альтернативной переменной pre / suffix и работает только в том случае, если вы используете
setlocal EnableDelayedExpansion
Используемая переменная !
будет проанализирована только тогда, когда оператор фактически выполняется вместо синтаксического анализа:
(
set name=!var[%%a]!
echo !name!
)
На этот раз блок кода будет игнорировать !
символ и искать только %
символ, и потому for
что цикл %%a
заменит на число:
(
set name=!var[0]!
echo !name!
)
(
set name=!var[1]!
echo !name!
)
(
set name=!var[2]!
echo !name!
)
(
set name=!var[3]!
echo !name!
)
В следующий раз, если вы захотите изменить переменную и использовать ее, вам, возможно, придется использовать !
вместо %
, иначе вы получите повторный результат. И если вы хотите echo
!
использовать символ, вы можете просто экранировать его:
echo escaped "^!" symbol^!
Комментарии:
1. Хорошее объяснение, но в последней строке есть крошечный недостаток
echo escaped "^!" symbol^!
, он показывает только первый восклицательный знак, вам нужно использовать двойные кареткиecho escaped "^!" symbol^^!