Вопрос по – Batch - чтение содержимого файла в массиве

2

Я имею текстовый файл с двумя строками (скажем, 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>

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

Ваш Ответ

2   ответа
1


Вы пытаетесь отладить или повторить что-нибудь там?

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

@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 терпит неудачу полностью.

3

как я бы это сделал, но это работает. Все после этого беспорядок. Похоже, вы думаете, что массивы являются формальной концепцией в пакетном режиме, когда это не так. Работать с переменными можно так, что это напоминает массивы. Но настоящие массивы не существуют внутри пакета.

Ты используешь%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.

Похожие вопросы