Por que o método “set / p” usado em um script em lote para ler a primeira linha de um arquivo de texto não está funcionando no corpo de um “for” -loop?

4

Eu tentei aplicar a resposta dada por Spaceballs para esta questão dentro do corpo de um for -loop .

example.bat:

@echo off

copy NUL %1
echo firstLine >> %1

echo /=======================/
for /l %%x in (1,1,3) do (
  echo %%x
  set /p A=< %1
  echo %A%
)
echo /=======================/

set /p A=< %1
echo %A%

Resultado de start example.bat temp.txt :

     1 file(s) copied.

/=======================/

1

ECHO is OFF.

2

ECHO is OFF.

3

ECHO is OFF.

/=======================/

firstLine

Por que set /p A=< %1 não está funcionando no corpo do for -loop?

    
por mra68 11.03.2016 / 13:48

1 resposta

3

O principal problema é que, além da variável de loop, cmd expande variáveis em um loop de arquivo em lote antes que o loop seja executado, portanto, embora A esteja sendo definido dentro do loop, o valor ecoado é anterior para entrada no loop (ou seja, em branco). Você pode ver que o valor foi definido omitindo o set antes do final echo : a saída será a mesma.

A resposta é ativar Expansão atrasada e use !A! em vez de %A% .

A propósito, os comandos copy e echo no início do arquivo são uma maneira desnecessariamente longa de escrever echo firstLine > %1 .

Assim, seu arquivo em lote funcionará como esperado se você modificá-lo da seguinte maneira: -

@echo off

SetLocal EnableDelayedExpansion

rem copy NUL %1
rem echo firstLine >> %1
echo firstLine > %1

echo /=======================/
for /l %%x in (1,1,3) do (
  echo %%x
  set /p A=< %1
  echo !A!
)
echo /=======================/

rem set /p A=< %1
echo %A%

Observe que você estará definindo A para o mesmo valor em cada passagem do loop. Você precisará usar uma técnica diferente se quiser que cada passagem mostre linhas sucessivas do arquivo.

    
por 11.03.2016 / 15:31