Я пытаюсь напечатать элементы массива в пакетном скрипте:

for %%i in (*.txt) do (
echo  !array[%n1%]!
set /A n1+=1
)

Но он не печатает элементы массива. Он печатает одно и то же снова и снова. Я тоже попробовал !array[!n1!]! но это тоже не работает.

2 ответа2

1

Нормальное расширение %n1% происходит при разборе строки. Любой заключенный в скобки блок кода, такой как ваше предложение DO(), анализируется одновременно. Таким образом, значение, которое вы видите на каждой итерации, является значением, существовавшим до запуска цикла.

Предложение wmz использовать CALL работает, но, по его словам, оно медленное. Существует лучший способ. Вы можете использовать отложенное расширение, чтобы передать значение n1 в переменную FOR, а затем использовать переменную FOR в качестве индекса "массива".

Если вы получаете синтаксическую ошибку с помощью команды REN, возможно, это связано с тем, что имя файла содержит пробел, поэтому его необходимо заключить в кавычки.

for %%F in (*.txt) do (
  for %%N in ("!n1!") do ren "%%F" "!array[%%N]!"
  set /a n1+=1
)

Обратите внимание, что ! законно в именах файлов. Любое имя файла, которое содержит ! будет поврежден при раскрытии "%%F" из-за отложенного расширения. Решение состоит в том, чтобы включать и выключать отложенное расширение по мере необходимости в цикле.

setlocal disableDelayedExpansion
for %%F in (*.txt) do (
  set "name=%%F"
  setlocal enableDelayedExpansion
  for %%N in ("!n1!") do ren "!name!" "!array[%%N]!"
  endlocal
  set /a n1+=1
)
endlocal
0

Из-за того, как работает переводчик, это не так просто, как следовало бы. Самый компактный способ это:
call echo %%array[!n1!]%% (предполагается, что setlocal enabledelayedexpansion)

Обратите внимание, что call имеет значительные накладные расходы; и эта интерпретация на самом деле не поддерживает массивы, это просто умный способ именования переменных, чтобы они выглядели как массив.

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