цикл for с несколькими переменными (массивами) для изменения каждого запуска

Как мне изменить разные переменные в цикле for при каждом запуске?

предполагать:

for %%i in ( 
              VAR:RUN1,RUN2,RUN3,RUN4,RUN5,RUN6,RUN7,RUN8,RUN9
             var1:1,2,3,4,5,6,7,8,9 
             var2:10,20,30,40,50,60,70,80,90 
             var3:a,b,c,d,e,f,g,h,i 
             var4:x,y,x,y,x,y,x,y,x 
                                                ) do (

echo %var1% %var2% %var3% %var4% 

)

в то время как есть, например. 9 разных значений каждой переменной?

или упорядочить вары лучше:

for %%i in ( 
          LoopRUN:VAR1,VAR2,VAR3,VAR4
             run1:1,10,a,x 
             run2:2,20,b,y
             run3:3,30,c,x 
             run4:4,40,d,y 
             run5:5,50,e,x 
             run6:6,60,f,y 
             run7:7,70,g,x 
             run8:8,80,h,y 
             run9:9,90,i,x 
                                                ) do (

echo %var1% %var2% %var3% %var4% 

)

Это должно привести к чему-то вроде этого:

       C:\>1,10,a,x 
       2,20,b,y
       3,30,c,x 
       4,40,d,y 
       5,50,e,x 
       6,60,f,y 
       7,70,g,x 
       8,80,h,y 
       9,90,i,x 

РЕДАКТИРОВАТЬ:

Я не вижу, как получить четкое соответствие между варами и вызовами.

Это немного сложнее, вместо "echo" в каждом прогоне/цикле также есть вызов:

"command /S %VAR1% -subswitch %VAR2% /H %VAR3% -o %VAR4%"

ОБЪЯСНЕНИЕ:

С выбранным решением можно также использовать строки REM, чтобы прогоны можно было просматривать:

REM Devicegroup A
run1
run2
run3
REM Devicegroup B
run4
run5
REM

Даже если кто-то забудет установить один VAR, это обрабатывается кодом, единственная проблема будет, если вы используете «run[x]…» во второй раз, так что следите за своей нумерацией прогонов!

Пока пробеги выполняются в неестественном порядке, не знаю, сможем ли мы это уловить. См. вывод:

command /S 10 -subswitch 10 /H a -o x
command /S 11 -subswitch 10 /H a -o x
command /S 12 -subswitch 20 /H b -o y
command /S 13 -subswitch 30 /H c -o x
command /S 14 -subswitch 40 /H d -o y
command /S 15 -subswitch 50 /H e -o x
ERROR: Missing variable in run[16]
command /S 17 -subswitch 70 /H g -o x
command /S 18 -subswitch 80 /H h -o y
command /S 19 -subswitch 90 /H i -o x
command /S 1 -subswitch 10 /H a -o x
command /S 20 -subswitch 20 /H b -o y
command /S 2 -subswitch 20 /H b -o y
command /S 3 -subswitch 30 /H c -o x
command /S 4 -subswitch 40 /H d -o y
command /S 5 -subswitch 50 /H e -o x
ERROR: Missing variable in run[6]
command /S 7 -subswitch 70 /H g -o x
command /S 8 -subswitch 80 /H h -o y
command /S 9 -subswitch 90 /H i -o x

person peet    schedule 12.12.2013    source источник
comment
пожалуйста, покажите array в вашем коде.   -  person Endoro    schedule 13.12.2013
comment
Вам нужно будет сказать, что именно вы хотите сделать. Исправление кода, который не делает то, что вы не указали, — это игра в угадайку.   -  person Magoo    schedule 13.12.2013
comment
@Endoro, если быть точным, их 9 :)   -  person peet    schedule 13.12.2013
comment
@Magoo Мне нужно отправить команду с 4 разными переменными много раз и каждый раз с разными значениями для каждой переменной.   -  person peet    schedule 13.12.2013
comment
@Endoro или 4 в зависимости от того, как расположить переменные 9x4 или 4x9. в то время как я бы предпочел пройти 9 раз по 4 вары.   -  person peet    schedule 13.12.2013
comment
Правильно ли я предполагаю, что вы пытаетесь извлечь четыре значения в каждом наборе в четыре отдельные переменные?   -  person unclemeat    schedule 13.12.2013
comment
@unclemeat вы правы, я добавил лучший пример в свой вопрос.   -  person peet    schedule 13.12.2013
comment
Обратите внимание, что run 9 times with 4 variables полностью отличается от run 4 times with 9 variables: имеется 9 массивов... или 4, в зависимости от того, как расположить переменные 9x4 или 4x9. в то время как я бы предпочел пройти 9 раз по 4 вары (?)   -  person Aacini    schedule 13.12.2013
comment
@ Аачини, я полностью согласен. Мне нужно 9 звонков в примере и возможно 14 звонков завтра, количество звонков соответствует количеству устройств. Из-за этого мне нравится способ 9 раз 4 - в то время как он должен сохранять читаемое определение массива для других коллег.   -  person peet    schedule 13.12.2013


Ответы (4)


Другой!

@echo off
setlocal EnableDelayedExpansion
set LF=^


rem ** Previous two empty lines required
set "vars=1,10,a,x;2,20,b,y;3,30,c,x;4,40,d,y;5,50,e,x;6,60,f,y;7,70,g,x;8,80,h,y;9,90,i,x"
for /F "tokens=1-4 delims=," %%A in ("%vars:;=!LF!%") do echo command /S %%A -subswitch %%B /H %%C -o %%D

Выход:

command /S 1 -subswitch 10 /H a -o x
command /S 2 -subswitch 20 /H b -o y
command /S 3 -subswitch 30 /H c -o x
command /S 4 -subswitch 40 /H d -o y
command /S 5 -subswitch 50 /H e -o x
command /S 6 -subswitch 60 /H f -o y
command /S 7 -subswitch 70 /H g -o x
command /S 8 -subswitch 80 /H h -o y
command /S 9 -subswitch 90 /H i -o x

EDIT: Добавлен новый метод в ответ на комментарии

Предыдущий пакетный файл — самый простой способ решить эту проблему. Однако, если вы хотите «сохранить определение массива в удобочитаемом виде для других коллег», то метод, описанный ниже, может быть более понятным. Эта программа также решает вашу проблему «включить тест, который проверяет, действительно ли у вас есть 4 вары»:

@echo off
setlocal

rem Define the *array* of variables per run
set run[1]=1,10,a,x
set run[2]=2,20,b,y
set run[3]=3,30,c,x
set run[4]=4,40,d,y
set run[5]=5,50,e,x
set run[6]=6,60,f
set run[7]=7,70,g,x
set run[8]=8,80,h,y
set run[9]=9,90,i,x

for /F "tokens=1-5 delims==," %%A in ('set run[') do (
   if "%%E" neq "" (
      ECHO command /S %%B -subswitch %%C /H %%D -o %%E
   ) else (
      echo ERROR: Missing variable in %%A
   )
)

Выход:

command /S 1 -subswitch 10 /H a -o x
command /S 2 -subswitch 20 /H b -o y
command /S 3 -subswitch 30 /H c -o x
command /S 4 -subswitch 40 /H d -o y
command /S 5 -subswitch 50 /H e -o x
ERROR: Missing variable in run[6]
command /S 7 -subswitch 70 /H g -o x
command /S 8 -subswitch 80 /H h -o y
command /S 9 -subswitch 90 /H i -o x
person Aacini    schedule 13.12.2013
comment
как всегда вдохновитель показывает интересные пути. в то время как массив здесь не так четко читается, как в примере с unclemeat, я думаю о том, как предотвратить запуск только с 3 заданными переменными вместо 4. Прогон с переменными из разных строк определения закончился бы катастрофой. - person peet; 13.12.2013
comment
все еще интересует ваша подстановка с пустыми строками, в чем здесь хитрость? Или лучше почему и как это работает, а не без? - person peet; 13.12.2013
comment
@peet: см. редактирование в моем ответе выше. Обратите внимание, что, строго говоря, вы не включили в свой вопрос какой-либо массив; отсюда и комментарий Эндоро: пожалуйста, покажите array в своем коде... - person Aacini; 13.12.2013
comment
Огромное спасибо за красивый и читаемый код, тем временем я читал о пакетах и ​​массивах и: ДА, эндоро, в пакетном режиме нет реального массива, хотя, по крайней мере, это приближение (ассоциативного) массива - насколько мы можем достичь в пакетном режиме. Справедливо ли с вашей стороны, сэр :), все равно отметить решение unclemeat как первое верное? - person peet; 13.12.2013
comment
Я имел в виду, что в вашем коде вы не пишете какой-либо пакетный массив, а просто несколько списков значений, разделенных запятыми, поэтому мое первое решение использует большую серию значений, разделенных запятыми, которые легче управлять. Массивами в пакетных файлах можно управлять эквивалентным способом других языков программирования; см. этот пост< /а>. Я думаю, что лучший ответ должен быть тем, который вы будете использовать для решения своей проблемы, но вы можете выбрать все, что пожелаете; это нормально для меня! ;-) - person Aacini; 14.12.2013
comment
вау, какое утреннее чтение, впечатляющий код. Ты понял. большинство людей не осознают, что то, что они используют, не так уж и далеко от начала всего этого. и лишь немногие знают, и еще меньше понимают Ассемблер, поэтому они в основном не знают, что делают. Мне очень нравится ваш пример кода пакетной базы данных, SIR. - person peet; 14.12.2013
comment
Можно ли заказать естественные пробеги? См. обновление вопроса, пожалуйста. - person peet; 14.12.2013
comment
@peet: Есть два немедленных решения для естественного порядка: используйте левый нуль в индексах меньше 10: set run[01]=1,10,a,x ИЛИ определите количество запусков в переменной: set N=20 и немного измените программу, чтобы использовать for /L %%i in (1,1,%N%)... вместо текущего for /F ... in ('set run[') .... Тем не менее, я предлагаю вам модифицировать программу, чтобы получать данные о прогонах из файла .txt вместо батч-кода! Таким образом, вы (и ваши коллеги) можете записывать данные о прогонах любым удобным для вас способом, поэтому я думаю, что этот метод решит все ваши проблемы... - person Aacini; 14.12.2013

@ECHO OFF
SETLOCAL
for %%r in (  "run1:1,10,a,x",
             "run2:2,20,b,y",
             "run3:3,30,c,x",
             "run4:4,40,d,y",
             "run5:5,50,e,x",
             "run6:6,60,f,y",
             "run7:7,70,g,x",
             "run8:8,80,h,y",
             "run9:9,90,i,x"
 ) DO (
 for /f "tokens=2delims=:" %%i in ("%%~r") do (
  echo %%i
 )
)
GOTO :EOF

должен произвести результат, который вы просили.

person Magoo    schedule 13.12.2013
comment
ха-ха, я опередил вас и дал почти такой же ответ, за исключением того, что вы не извлекли четыре значения в отдельные переменные. почему вы включили "run1:" "run2:" и т. д.? - person unclemeat; 13.12.2013
comment
@unclemeat да - увидел ваш пост и проверил на сходство. До сих пор нет четкого представления о том, насколько гибок формат данных, действительно ли они поступают из файла, нужно ли устанавливать 4 переменные или будет ли вызываться подпрограмма со строками, разделенными запятыми, в качестве параметров. Решил сделать именно то, что просили - но у меня в буфер обмена была записана идентичная техника, так что - публикуй и будь проклят, как говорится... :) - person Magoo; 13.12.2013
comment
Справедливо. Хотя это довольно неясно, я решил, что он, вероятно, хотел, чтобы они были в отдельных переменных, из-за строки в его вопросе - echo %var1% %var2% %var3% %var4%. - person unclemeat; 13.12.2013
comment
я правильно понимаю вас двоих, что в примере unclemeat переменные упорядочиваются только по разделителю, а в вашем первом по строке, а затем по:? - person peet; 13.12.2013
comment
@peet Учитывая ваше последнее редактирование, используйте версию unclemeat и замените echo %%A... на command /S %%A -subswitch %%B /H %%C -o %%D - person Magoo; 13.12.2013

@echo off

for %%i in (
    "1,10,a,x"
    "2,20,b,y"
    "3,30,c,x"
    "4,40,d,y" 
    "5,50,e,x" 
    "6,60,f,y" 
    "7,70,g,x" 
    "8,80,h,y" 
    "9,90,i,x"
) do for /f "delims=, tokens=1-4" %%A in ("%%~i") do (
    echo %%A %%B %%C %%D
)

от %%A до %%D могут соответствовать вашим номерам от %var1% до %var4%.

Дайте мне знать, если вам нужно что-нибудь объяснить.

person unclemeat    schedule 13.12.2013
comment
command /S %%A -subswitch %%B /H %%C -o %%D будет ли это работать и в вашем цикле? - person peet; 13.12.2013
comment
Обязательно должно работать. Попробуйте и дайте мне знать. Добавьте его после echo или замените эхо своей командой. - person unclemeat; 13.12.2013
comment
хотя 'echo %%~i' можно с пользой заменить на "%%~i" - person Magoo; 13.12.2013
comment
Вы правы - это немного чище. Ваше здоровье. - person unclemeat; 13.12.2013
comment
@peet, если это сработало для вас, отметьте это как правильный ответ. Если нет, дайте мне знать. - person unclemeat; 13.12.2013
comment
Попробую сегодня позже, только сейчас встал :) Одного очка не понял до сих пор. Что произойдет, если кто-то изменит мой скрипт и, возможно, случайно установит только 3 vars в одной строке? - person peet; 13.12.2013
comment
я думаю о том, как предотвратить прогон только с 3 новыми заданными переменными вместо 4. Прогон с переменными из разных строк определения закончился бы катастрофой, и если бы кто-то только определил строку с 3 переменными, 4-й остался бы старый да? Можем ли мы легко установить их пустыми перед каждым циклом? Я бы хотел, чтобы код оставался таким же простым, маленьким и простым, чтобы каждый мог его прочитать и понять. - person peet; 13.12.2013
comment
Если бы четыре переменные не были определены в итерации цикла, то нет, переменные не сохранили бы свои предыдущие значения. Например, если в итерации этого цикла нужно работать только с тремя значениями, %%D расширится до %%D, а не, скажем, до x. - person unclemeat; 13.12.2013
comment
Если вы устанавливаете эти значения вручную, зачем добавлять обработку ошибок для неправильных значений? - person unclemeat; 13.12.2013
comment
потому что однажды коллега будет использовать скрипт, и жизнь научила меня, что если есть возможность сделать это неверным, они найдут и сделают это :) второй приятный вариант в коде aacini - использовать ремарки и структурировать строки, но спасибо миллион за ваши усилия и вклад - я действительно ценю. - person peet; 14.12.2013

person    schedule
comment
Выглядит очень впечатляюще, хотя я бы предпочел пройти 9 раз по 4 вары, а ваш пример позволит убедиться, что дано 4 вары, я думаю, пока я не вижу, как :) - person peet; 13.12.2013
comment
Вы хотите включить тест, который проверяет, действительно ли у вас есть 4 vars? - person SachaDee; 13.12.2013
comment
хороший и структурированный код, в то время как никто из моих коллег не смог его уследить, лол. слишком верхний уровень для структуры наоборот 9 раз 4 vars. в любом случае спасибо, может быть, вы могли бы мне помочь для">здесь? - person peet; 14.12.2013