FOR loop e avaliação de variáveis na linha de comando do Windows

0

Considere isso como o conteúdo de um arquivo .cmd :

@echo off
set test1=hello
echo 0 %test1%
for %%F in ( *.txt ) do (
  set test2=%%F
  echo 1 %test1%
  echo 2 %test2%
  echo 3 %%F
)
pause

Quando executo esse script no Win 7 a partir de uma pasta contendo a.txt e b.txt como os únicos arquivos .txt, recebo o seguinte:

0 hello
1 hello
2
3 a.txt
1 hello
2
3 b.txt
Press any key to continue . . .

Todos os comandos de eco "bem-sucedidos" (iniciando com 0, 1 e 3) são prova de que a sintaxe de eco e variável está correta. O comando "mal sucedido" echo (2) só pode ser o resultado de um comando SET malsucedido. Como? Por quê? Qual sintaxe do comando SET eu preciso para que a variável test2 seja atribuída corretamente, e as linhas de saída começando com 2 sejam idênticas àquelas iniciando com 3?

    
por omatai 09.01.2014 / 00:54

1 resposta

1

O comando SET está totalmente bem. O que está acontecendo é que todo o bloco DO no comando FOR tem suas variáveis substituídas quando é lido pela primeira vez. Nesse ponto, a variável test2 está vazia, de modo que é o que é ecoado na saída.

Para corrigir isso, você precisa usar um SETLOCAL EnableDelayedExpansion antes do loop for e alterar o echo %test2% para echo !test2! da seguinte forma:

@echo off
set test1=hello
echo 0 %test1%
setlocal enabledelayedexpansion
for %%F in ( *.txt ) do (
  set test2=%%F
  echo 1 %test1%
  echo 2 !test2!
  echo 3 %%F
)
endlocal
pause
    
por 09.01.2014 / 01:41