Хранение нескольких путей в виде строк внутри массива в cmd - PullRequest
0 голосов
/ 05 июля 2018

Я написал следующий пакетный файл:

setlocal EnableDelayedExpansion
set integer=0
for /f "delims=" %%a in ('where /R C:\ /F python.exe') do (
    set Paths[!integer!]=%%a
    set /A integer+=1
)

for %%b in (%Paths%) do (
    echo %%b
)

Идея состоит в том, что я хочу запустить where /R C:\ /F python.exe и затем сохранить несколько путей, выведенных в массив, мне это нужно, потому что мне нужно обработать эти пути позже. До сих пор для целей тестирования я вызывал вторую половину скрипта просто для того, чтобы убедиться, что массив работает правильно.

1 Ответ

0 голосов
/ 05 июля 2018

Ваша вторая часть неверна. Поскольку в пакетных сценариях нет реальных массивов, вы не можете использовать цикл 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, они тоже возвращаются;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...