Цикл "массива" в пакетном файле для сдвига элементов

У меня есть командный файл, который передается команды в виде строкового массива из файла 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

Это должно работать для вас - легкий и трудный путь.

Другие вопросы по тегам