Цикл "массива" в пакетном файле для сдвига элементов
У меня есть командный файл, который передается команды в виде строкового массива из файла Java. Команды содержат что-то вроде следующего:
String[] commands = {"A",
"B",
"C",
"C:\users\user\Documents",
"C:\users\user\Pictures"}
Массив команд является динамическим, так как он изменяется каждый раз, когда запускается Java-программа. В командном файле я создаю переменные, которые принимают значения первых трех элементов (в данном случае A, B и C). Затем мне нужно сдвинуть строки каталога, чтобы они заняли первые три элемента массива. Вот код партии, который у меня есть:
@echo off
setlocal enableDelayedExpansion
set /A paramCount=0
for %%x in (%*) do (
set list[!paramCount!]=%%x
set /A paramCount=paramCount+1
)
set argA=%list[0]%
set argB=%list[1]%
set argC=%list[2]%
set /A old=0
set /A new=!old!+3
for /F "tokens=2 delims==" %%a in ('set list[') do (
echo old=!old!
echo new=!new!
set list[!old!]=!list[%new%]!
echo !list[%old%]!
set /A old=!old!+1
set /A new=!new!+1 )
У меня проблема с линией set list[!old!]=!list[%new%]!
, Как видите, у меня отложенное расширение включено. Однако,!! необходимы для переменной list[...], которая эмулирует элемент в массиве. Тем не менее, я считаю, что нужно использовать отложенное расширение для "нового". Что мне делать в этом случае? Или, возможно, проблема не в этом? "Старые" и "новые" переменные увеличиваются правильно, но echo !list[%old%]!
строка возвращает одно и то же значение каждый раз. Я ожидаю, что та же проблема существует в этой строке со "старым"- оно должно иметь! Вокруг него, но! Уже используются для переменной list[...]. Так что же произойдет, если вам понадобится вложенный! В утверждении? Спасибо за помощь!
1 ответ
@echo off
setlocal ENABLEDELAYEDEXPANSION
set /A paramCount=-3
for %%x in (%*) do (
set list[!paramCount!]=%%x
set /A paramCount=paramCount+1
)
set argA=%list[-3]%
set argB=%list[-2]%
set argC=%list[-1]%
for /F "tokens=2 delims==" %%a in ('set list[-') do SET "%%a="
SET arg
SET list
ENDLOCAL
echo==================
setlocal ENABLEDELAYEDEXPANSION
set /A paramCount=0
for %%x in (%*) do (
set list[!paramCount!]=%%x
set /A paramCount=paramCount+1
)
set argA=%list[0]%
set argB=%list[1]%
set argC=%list[2]%
set /A old=0
set /A new=!old!+3
for /F "tokens=2 delims==" %%a in ('set list[') do (
echo old=!old!
echo new=!new!
CALL set list[%%old%%]=%%list[!new!]%%
CALL ECHO(%%list[!old!]%%
set /A old=!old!+1
set /A new=!new!+1
)
SET arg
SET list
GOTO :EOF
Это должно работать для вас - легкий и трудный путь.