Итерировать массив внутри другого цикла for в пакете - PullRequest
0 голосов
/ 05 сентября 2018

Я бы хотел перебрать массив внутри другого цикла for.

Я попробовал все, используя ! % и %%, и я могу перебрать i, но не могу получить доступ к своему array, используя это i

вот код, который я хотел бы сделать так, чтобы он работал:

rem stats.json contains -> { 1: "10%", 2: "20%", 3: "30%", 4: "40%", 5: "50%", 6: "60%" }
for /f "delims=" %%x in (stats.json) do set json=%%x
set json=%json:"=%
set "json=%json:~2,-2%"
set "json=%json:: =]=%"
set "stats[%json:, =" & set "stats[%"

echo stats[1]=%stats[1]%
echo stats[2]=%stats[2]%
echo stats[3]=%stats[3]%
echo stats[4]=%stats[4]%
echo stats[5]=%stats[5]%
echo stats[6]=%stats[6]%

set i=1
for %%f in (A, B, C) do (
 set /a j=!i!*2-1
 set /a k=!i!*2
 echo %%f - %stats[!j!]% - %stats[!k!]%
 set /a i+=1
)

Кто-нибудь знает, как изменить цикл for, чтобы он работал правильно?

j и k рассчитаны правильно, но строка echo %%f - %stats[!j!]% - %stats[!k!]% не работает вообще.

Текущий результат:

A -  -
B -  -
C -  -

ожидаемый результат:

A - 10% - 20%
B - 30% - 40%
C - 50% - 60%

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вот как бы я это сделал:

@echo off
setlocal EnableDelayedExpansion

rem stats.json contains -> { 1: "10%", 2: "20%", 3: "30%", 4: "40%", 5: "50%", 6: "60%" }
for /f "delims=" %%x in (stats.json) do set "json=%%x"
set json=%json:"=%
set "json=%json:~2,-2%"
set "json=%json:: =]=%"
set "stats[%json:, =" & set "stats[%"

SET STATS

set /a i=1
for %%f in (A, B, C) do (
   set /a j=i*2-1, k=i*2
   for /F "tokens=1,2" %%j in ("!j! !k!") do echo %%f - !stats[%%j]! - !stats[%%k]!
   set /a i+=1
)

Этот код работает намного быстрее. Подробнее см. Массивы, связанные списки и другие структуры данных в сценарии cmd.exe (пакетная обработка)

0 голосов
/ 05 сентября 2018

Вот рабочий код:

rem stats.json contains -> { 1: "10%", 2: "20%", 3: "30%", 4: "40%", 5: "50%", 6: "60%" }
for /f "delims=" %%x in (stats.json) do set json=%%x
set json=%json:"=%
set "json=%json:~2,-2%"
set "json=%json:: =]=%"
set "stats[%json:, =" & set "stats[%"

echo stats[1]=%stats[1]%
echo stats[2]=%stats[2]%
echo stats[3]=%stats[3]%
echo stats[4]=%stats[4]%
echo stats[5]=%stats[5]%
echo stats[6]=%stats[6]%

setlocal EnableDelayedExpansion
set /a i=1
for %%f in (A, B, C) do (
set /a j=!i!*2-1
set /a k=!i!*2
call echo(%%f - %%stats[!j!]%% - %%stats[!k!]%%
set /a i+=1
)
endlocal

Мне пришлось заменить echo %%f - %stats[!j!]% - %stats[!k!]% на call echo(%%f - %%stats[!j!]%% - %%stats[!k!]%%, но я не знаю почему: если кто-то получил ответ

...