Imprimir elementos de uma matriz no script em lote

0

Estou tentando imprimir elementos de uma matriz em script em lote:

for %%i in (*.txt) do (
echo  !array[%n1%]!
set /A n1+=1
)

Mas não imprime os elementos da matriz. Ele imprime a mesma coisa de novo e de novo. Eu também tentei !array[!n1!]! mas também não funciona.

    
por Sab 01.12.2012 / 12:18

2 respostas

1

A expansão normal %n1% ocorre quando a linha é analisada. Qualquer bloco de código entre parênteses, como sua cláusula DO (), é analisado de uma só vez. Portanto, o valor que você vê em cada iteração é o valor que existia antes da execução do loop.

A sugestão do wmz para usar o CALL funciona, mas como ele diz, é lento. Há um caminho melhor. Você pode usar a expansão atrasada para transferir o valor n1 para uma variável FOR e, em seguida, usar a variável FOR como seu índice "matriz".

Se você está recebendo um erro de sintaxe com seu comando REN, provavelmente é porque um nome de arquivo contém um espaço, então ele precisa ser colocado entre aspas.

for %%F in (*.txt) do (
  for %%N in ("!n1!") do ren "%%F" "!array[%%N]!"
  set /a n1+=1
)

Observe que ! é legal em nomes de arquivos. Qualquer nome de arquivo que contenha ! será corrompido quando "%%F" for expandido devido à expansão atrasada. A solução é ativar e desativar a expansão atrasada conforme necessário no loop.

setlocal disableDelayedExpansion
for %%F in (*.txt) do (
  set "name=%%F"
  setlocal enableDelayedExpansion
  for %%N in ("!n1!") do ren "!name!" "!array[%%N]!"
  endlocal
  set /a n1+=1
)
endlocal
    
por 01.12.2012 / 16:22
0

Por causa do funcionamento do interpretador, ele não é tão simples quanto deveria. A maneira mais compacta é:
call echo %%array[!n1!]%% (isto assume setlocal enabledelayedexpansion )

Por favor, note que call tem sobrecarga significativa; e que interpretada não suporta arrays, é apenas uma forma inteligente de nomear variáveis para que elas pareçam uma matriz.

    
por 01.12.2012 / 13:32

Tags