Я предлагаю сначала прочитать Как интерпретирует сценарии интерпретатора команд 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 'в командной строке?