Пакетный скрипт - создание динамических имен переменных или массива в цикле For

Я хотел бы спросить, можете ли вы посоветовать.

Я не знаю, можно ли создавать имена динамических переменных в пакете или массиве или что-то в этом роде. Например, установите c = 0 перед циклом for, а затем установите c = c + 1 внутри цикла for и используйте это число для создания имени динамической переменной внутри цикла for, например: установите запись% c% = 'somestring'

а затем используйте эти пронумерованные переменные для вывода вывода вне цикла for, например: echo% entry1% echo% entry2%

Пример:

@echo off

set /a c=1

for %%i in (list.txt) do (

set /a c=c+1
set entry%c% = %%i

)

echo %entry1%
echo %entry2%

Спасибо за помощь.


person damian1baran    schedule 15.06.2014    source источник
comment
Посмотрите на переменные отложенного раскрытия. setLocal enableDelayedExpansion.   -  person unclemeat    schedule 16.06.2014
comment
См .: Массивы в cmd.exe (пакетный) скрипт   -  person Aacini    schedule 16.06.2014


Ответы (2)


Я бы использовал

for /f "tokens=1*delims=[]" %%a in ('find /n /v "" list.txt') do set "entry%%a=%%b"

но слово предупреждения о

set entry%c% = %%i

Пакетная обработка чувствительна к пробелам в выражении SET. Если бы это сработало, переменной с именем «entry1 Space» было бы присвоено значение «Space thefirstlineofthefile».

Синтаксис set "var=value", который я использовал, гарантирует, что любые конечные пробелы в строке пакета не будут включены в значение, присвоенное var.

person Magoo    schedule 16.06.2014
comment
+1 Это очень умно. Мне нравится использовать переключатель find / v, чтобы исключить возможность пустых переменных, и, конечно, / n для нумерации переменных. Очень хороший лайнер. - person unclemeat; 16.06.2014
comment
Здорово! Спасибо - именно то, что я искал. Я ценю вашу помощь. - person damian1baran; 16.06.2014

Вам необходимо использовать переменные с отложенным раскрытием, иначе c всегда будет расширяться до одного и того же значения.

Вам также необходимо удалить пробелы в вашем операторе set. set entry%c% = %%i создаст переменную с именем (например) entry1<space>, которую вам нужно будет расширить так - %entry1 %. Так что просто удалите эти пробелы вокруг оператора =.

@echo off

setLocal enableDelayedExpansion
set c=0

for %%i in (list.txt) do (
    set /a c+=1
    set entry!c!=%%i
)

echo %entry1%
echo %entry2%

Также, если вы хотите перебрать все созданные вами переменные, вы можете сделать что-то вроде следующего.

for /L %%i in (!c!, -1, 1) do echo !entry%%i!

or

for /L %%i in (1, 1, !c!) do echo !entry%%i!
person unclemeat    schedule 15.06.2014