Почему переменная% не работает как переменная! в моем пакетном файле?

#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^^!