Вопрос по – Batch - чтение содержимого файла в массиве
Я имею текстовый файл с двумя строками (скажем, param.txt), который показан ниже:
<code>Mar2012 dim1,dim2,dim3,dim4 </code>
Я хочу прочитать этот файл в пакетном режиме и сохранить содержимое первой строки в переменной с именем cube_name. Когда я читаю вторую строку, я хочу разделить запятую строку dim1, dim2, dim3, dim4 и создать массив из четырех элементов. Я планирую использовать переменную и массив в более поздней части сценария.
Код, который я создал, показан ниже. Код не работает, как ожидалось.
<code>@echo off & setlocal enableextensions enabledelayedexpansion set /a count_=0 for /f "tokens=*" %%a in ('type param.txt') do ( set /a count_+=1 set my_arr[!count_!]=%%a ) set /a count=0 for %%i in (%my_arr%) do ( set /a count+=1 if !count! EQU 1 ( set cube_name=%%i ) if !count! GTR 1 ( set dim_arr=%%i:@=,% ) ) for %%i in (%dim_arr%) do ( echo %%i ) echo !cube_name! </code>
Когда я запускаю код, я вижу следующее:
<code>C:\Working folder>test2.bat ECHO is off. </code>
Так что это, похоже, не работает, и я не могу понять, что я делаю неправильно. Я довольно новичок в пакетном скриптинге, поэтому помощь приветствуется
Вы пытаетесь отладить или повторить что-нибудь там?
Вы можете просто добавить несколько эхо-сигналов, чтобы понять, почему ваш код не работает.
@echo off & setlocal enableextensions enabledelayedexpansion
set /a count_=0
for /f "tokens=*" %%a in ('type param.txt') do (
set /a count_+=1
set my_arr[!count_!]=%%a
)
echo ### show the variable(s) beginning with my_arr...
set my_arr
echo Part 2----
set /a count=0
echo The value of my_arr is "%my_arr%"
for %%i in (%my_arr%) do (
set /a count+=1
echo ## Count=!count!, content is %%i
if !count! EQU 1 (
set cube_name=%%i
)
if !count! GTR 1 (
echo ## Setting dim_arr to "%%i:@=,%"
set dim_arr=%%i:@=,%
echo
)
)
for %%i in (%dim_arr%) do (
echo the value of dim_arr is "%%i"
)
echo cube_name is "!cube_name!"
Выход
### show the variable(s) beginning with my_arr...
my_arr[1]=Mar2012
my_arr[2]=dim1,dim2,dim3,dim4
Part 2----
The value of my_arr is ""
cube_name is ""
Как вы можете видеть, ваша часть 2 терпит неудачу полностью.
как я бы это сделал, но это работает. Все после этого беспорядок. Похоже, вы думаете, что массивы являются формальной концепцией в пакетном режиме, когда это не так. Работать с переменными можно так, что это напоминает массивы. Но настоящие массивы не существуют внутри пакета.
Ты используешь%my_arr% как будто это массив, ноmy_arr даже не определено. Вы определили переменныеmy_arr[1] драмmy_arr[2] - скобки и число являются частью имени переменной.
Похоже, что вы неправильно понимаете циклы FOR. Я предлагаю вам внимательно прочитать документацию FOR (типHELP FOR
из командной строки). Также посмотрите на примеры на этом и других сайтах. Команда FOR очень сложна, потому что она имеет много вариаций, которые похожи на неподготовленный глаз, но имеют совершенно другое поведение. Один отличный ресурс, чтобы помочь вашему пониманиюhttp://judago.webs.com/batchforloops.htm
Предполагая, что файл всегда имеет ровно 2 строки, я бы решил вашу проблему так
@echo off
setlocal enableDelayedExpansion
set dimCnt=0
<param.txt (
set /p "cube_name=" >nul
set /p "dimList=" >nul
for %%D in (!dimList!) do (
set /a dimCnt+=1
set "dim[!dimCnt!]=%%D"
)
)
echo cube_name=!cube_name!
for /l %%I in (1 1 !dimCnt!) do echo dim[%%I]=!dim[%%I]!
Одна приятная особенность вышеуказанного решения заключается в том, что оно допускает различное количество терминов в списке измерений во 2-й строке. Это не удастся, если есть табуляция, пробел, точка с запятой, равно,*
или же?
в именах измерений. Существуют относительно простые способы обойти это ограничение в случае необходимости.
Вкладки, пробелы, точки с запятой и равно могут быть обработаны с помощью поиска и замены, чтобы заключить каждый термин в кавычки.
for %%D in ("!dimList:,=","!") do (
set /a dimCnt+=1
set "dim[!dimCnt!]=%%~D"
)
Я не буду публиковать полное решение здесь, так как оно вряд ли понадобится. Но обработка*
и / или?
потребует замены запятых на символ новой строки и переключения на оператор FOR / F.