Pergunta sobre batch-file – Lote - Lê o conteúdo de um arquivo em um array

2

Eu tenho um arquivo de texto com duas linhas (digamos param.txt), que é mostrado abaixo:

<code>Mar2012
dim1,dim2,dim3,dim4
</code>

Eu quero ler esse arquivo em lote e armazenar o conteúdo da primeira linha em uma variável chamada cube_name. Quando estou lendo a segunda linha, quero dividir a string delimitada por vírgula dim1, dim2, dim3, dim4 e criar uma matriz de quatro elementos. Estou planejando usar a variável e o array na parte posterior do script.

O código que criei é mostrado abaixo. O código não está funcionando conforme o esperado.

<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>

Eu vejo o seguinte quando executo o código:

<code>C:\Working folder>test2.bat
ECHO is off.
</code>

Então, isso não parece funcionar e não consigo entender o que estou fazendo de errado. Eu sou relativamente novo no script em lote, então a ajuda é apreciada

Sua resposta

2   a resposta
1

Estou impressionado com o seu código!
Você tenta depurar ou fazer eco de alguma coisa lá?

Você pode simplesmente adicionar alguns ecos para ver por que seu código não funciona.

<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!"
</code>

Saída é

<code>### 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 ""
</code>

Como você pode ver, sua part2 falha completamente.

3

Seu primeiro loop FOR é OK. Não é como eu faria, mas funciona. Tudo depois disso é uma bagunça. Parece que você acha que os arrays são um conceito formal em lote, quando não são. É possível trabalhar com variáveis ​​de uma maneira que pareça reminiscente de matrizes. Mas os arrays verdadeiros não existem dentro do lote.

Você usa% my_arr% como se fosse uma matriz, masmy_arr não é nem mesmo definido. Você definiu variáveismy_arr [1] amdmy_arr [2] - os colchetes e o número fazem parte do nome da variável.

Também parece que você tem um mal-entendido de loops FOR. Eu sugiro que você leia atentamente a documentação do FOR (tipoHELP FOR a partir de uma linha de comando). Veja também exemplos neste e em outros sites. O comando FOR é muito complicado porque tem muitas variações que parecem semelhantes ao olho destreinado, mas têm comportamentos profundamente diferentes. Um excelente recurso para ajudar a sua compreensão éhttp://judago.webs.com/batchforloops.htm

Assumindo que o arquivo sempre tenha exatamente 2 linhas, eu resolveria seu problema assim

<code>@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]!
</code>

Uma boa característica da solução acima é permitir um número variável de termos na lista de dimensões na segunda linha. Ele falhará se houver tabulações, espaços, ponto e vírgula, igual* ou? nos nomes das dimensões. Existem maneiras relativamente simples de contornar essa limitação, se necessário.

Guias, espaços, ponto-e-vírgula e igual podem ser manipulados usando-se pesquisa e substituição para incluir cada termo entre aspas.

<code>  for %%D in ("!dimList:,=","!") do (
    set /a dimCnt+=1
    set "dim[!dimCnt!]=%%~D"
  )
</code>

Não vou postar a solução completa aqui, pois não é provável que seja necessária. Mas manuseio* e / ou? exigiria substituir as vírgulas por um caractere de nova linha e mudar para uma instrução FOR / F.

Perguntas relacionadas