terça-feira, abril 19, 2011

Expansão de variáveis de ambiente atrasada

Eu tive um professor que dizia o seguinte:

"Se você precisa fazer a mesma tarefa mais de três vezes você pode automatizá-la."

Por esse motivo, hoje, precisei fazer um Script Windows/DOS Batch (argh!), já que minha estação de trabalho roda Windows (argh!). A tarefa era bem simples: copiar alguns arquivos de um lugar pra outro, usando a estrutura de diretórios definida de acordo com um parâmetro específico.

Vamos ao exemplo:
FOR %%A IN (env1 env2 env3) DO (

SET DIR1=C:\foo\%%A\dir
SET DIR2=C:\bar\%%A\dir

COPY %DIR1%\lib\file.jar %DIR2%\lib\library.jar
)

O problema é que scripts Windows/DOS Batch não fazem a substituição das variáveis no tempo de execução, ou de acordo com o texto oficial, por padrão não há suporte para expansão de variáveis de ambiente atrasada (argh!). Você tem que explicitamente habilitar isso no shell de comandos. Para fazer isso basta abrir um shell com o parâmetro /V:ON.

Como eu não queria abrir um shell informando esse parâmetro para que meu script funcionasse, fui procurar uma forma automática de fazer isso no momento da execução do meu script. Descobri outro comando: o SETLOCAL. Informando o argumento EnableDelayedExpansion você habilita a expansão de variáveis de ambiente atrasada. Mas não é só isso. A forma de acessar a variável também muda. Deve-se usar o operador !nome_da_variável!.

Após essas configurações/alterações meu script ficou assim:
SETLOCAL enabledelayedexpansion
FOR %%A IN (env1 env2 env3) DO (

SET DIR1=C:\foo\%%A\dir
SET DIR2=C:\bar\%%A\dir

COPY !DIR1!\lib\file.jar !DIR2!\lib\library.jar
)

Bom! É isso! Se você precisar usar o recurso de expansão de variáveis de ambiente atrasada (argh!) já sabe como fazer.