Как использовать элемент массива в качестве индекса другого массива в цикле? - PullRequest
0 голосов
/ 24 ноября 2018

У меня небольшая проблема, и я не могу заставить себя работать.Вот код:

SET onts=3

SET port[1]=0
SET port[2]=3
SET port[3]=2

SET free[0]=8
SET free[1]=5
SET free[2]=5
SET free[3]=15

FOR /L %%A IN (1,1,%onts%) DO (
    SET /A ont[%%A]=%free[%port[%%A]%]%
)

echo %ont[1]%
echo %ont[2]%
echo %ont[3]%

Я ожидаю, что код принимает значение итерации первого цикла 0 переменной port[1] в качестве индекса и, таким образом, обращается к переменной free[0], чтобы присвоить ее значение 8 переменнойont[1].На второй итерации значение 3 переменной port[2] должно использоваться для получения значения 15, присвоенного переменной free[3], назначенной рядом с переменной ont[2].И на третьей итерации переменная ont[3] должна быть определена со значением 5 из free[2] после чтения значения 2 из port[3].

Таким образом, вывод должен быть:

8
15
5

Но пакетный файл выдает:

0
3
2

Я пытался использовать вторую переменную в цикле:

SET /A var1 = %port[%%A]%
SET /A ont[%%A]=%free[%var1%]%

Но это тоже не сработало.

Я также пытался вызвать функцию для передачи этого кода на аутсорсинг, но по-прежнему ничего не получилось - в этом я не уверен, возможно, я сделал что-то не так.

Кто-нибудь знает, как это сделать?работать?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Вашему подходу нужны два (с кодовым блоком на самом деле три) уровня отложенного расширения, вы не используете ни один.

Мой предыдущий ответ продемонстрировал, как использовать отложенное расширение

Mofi с хорошим ответ показываетодин способ преодолеть двойное задержанное расширение с помощью for,
, вот другой способ с псевдо-вызовом:

:: Q:\Test\2018\11\24\SO_53458343.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
SET onts=3

SET port[1]=0
SET port[2]=3
SET port[3]=2

SET free[0]=8
SET free[1]=5
SET free[2]=5
SET free[3]=15

FOR /L %%A IN (1,1,%onts%) DO Call SET /A "ont[%%A]=%%free[!port[%%A]!]%%"

echo ont[1]=%ont[1]%
echo ont[2]=%ont[2]%
echo ont[3]=%ont[3]%

> Q:\Test\2018\11\24\SO_53458343.cmd
ont[1]=8
ont[2]=15
ont[3]=5
0 голосов
/ 24 ноября 2018

Я предлагаю сначала прочитать Как интерпретирует сценарии интерпретатора команд Windows (CMD.EXE)? .

Командный процессор Windows анализирует весь блок команд, начиная с ( и заканчиваяс соответствием ) и заменяет все ссылки на значения переменных среды, выполненные с помощью %variable%, на текущее значение переменной среды, соответственно, ничего для переменной среды не существует.

Это означает для командной строки SET /A ont[%%A]=%free[%port[%%A]%]%, что cmd.exe интерпретирует %free[% как ссылку на значение переменной среды с именем free[ и %]% как ссылку на значение переменной среды с именем ] перед выполнением команды FOR .Не существует ни переменной среды free[, ни ], определенной выше FOR командной строки, и можно ожидать, что такие переменные среды вообще не существуют до запуска пакетного файла.По этой причине командный процессор Windows, наконец, после фазы предварительной обработки выполняет командную строку:

FOR /L %A IN (1 1 3) DO (SET /A ont[%A]=port[%A] )

Это можно увидеть при запуске командного файла в точности как отправлено (без @echo off, как обычно используется в качестве первой командной строки) вокно командной строки.

Одно из решений заключается в использовании отложенное расширение и еще один цикл FOR для получения значения free[y] в зависимости от значения port[x], назначенного дляпеременная окружения ont[x].

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "onts=3"

set "port[1]=0"
set "port[2]=3"
set "port[3]=2"

set "free[0]=8"
set "free[1]=5"
set "free[2]=5"
set "free[3]=15"

for /L %%A IN (1,1,%onts%) do for %%B in (!port[%%A]!) do set "ont[%%A]=!free[%%B]!"

echo %ont[1]%
echo %ont[2]%
echo %ont[3]%
endlocal

Вывод этого пакетного файла:

8
15
5

Для понимания используемых команд и их работы откройте окно командной строки, выполнитевыполните следующие команды и полностью прочитайте все справочные страницы, отображаемые для каждой команды.

  • echo /?
  • endlocal /?
  • for /?
  • set /?
  • setlocal /?

Последнее, что я предлагаю прочитать ответ на Почему после использования строки не выводится «echo% var%»установить var = text 'в командной строке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...