Ваша вторая часть неверна. Поскольку в пакетных сценариях нет реальных массивов, вы не можете использовать цикл for
, похожий на что-то вроде for each element in array do
, как в других языках. За подробностями обращайтесь к этому сообщению: Массивы, связанные списки и другие структуры данных в сценарии cmd.exe (пакетная обработка) .
Чтобы перебрать все (псевдо-) элементы массива, вы можете сделать следующее:
set /A count=integer-1
for /L %%i in (0,1,%count%) do echo Paths[%%i] = !Paths[%%i]!
Как подсказывает Aacini в комментарии , вы можете изменить ваш base-0 на base-1 (псевдо-) массив, переместив линию set /A integer+=1
вверх, чтобы перед строкой set Paths[!integer!]=%%a
в первой части, поэтому переменная integer
уже содержит наибольший индекс, что привело бы к несколько более простой второй части:
for /L %%i in (1,1,%integer%) do echo Paths[%%i] = !Paths[%%i]!
В качестве альтернативы, вы можете использовать цикл for /F
, который анализирует вывод set Paths[
:
for /F "tokens=1* delims==" %%i in ('set Paths[ 2^> nul') do echo %%i = %%j
Это может быть полезно:
- вам не нужно знать общее количество элементов;
- индексы не должны быть смежными, они могут быть даже не числовыми;
Но есть две оговорки:
- (псевдо-) элементы массива не возвращаются в порядке возрастания относительно индексов, потому что
set Paths[
возвращает их в алфавитном порядке, где порядок равен 0
, 1
, 10
, 11
, ..., 2
и т. Д., Поэтому порядок становится беспорядочным, как только появляются индексы с более чем одной цифрой;
- в случае, если существуют другие переменные, начинающиеся с этого имени, например
Paths[invalid]
или Paths[none
, они тоже возвращаются;