Lê linhas de um arquivo na janela de comando e expande variáveis

2

Estou tentando ver se é possível ler linhas de um arquivo na janela de comando e depois gravá-las em um arquivo. A parte complicada é que em qualquer lugar no arquivo em que haja texto parecido com uma variável, eu gostaria que ela fosse expandida.

A idéia é ter um arquivo mestre em batch onde eu defino as variáveis e então leio o arquivo padrão e substituo as variáveis por valores do mestre.

Conteúdo do arquivo

################################################################################
#
# Response file
#
################################################################################

################################################################################
#
# License Acceptance
#
# If you accept the license, <value> should be "true".
#
LICENSE_ACCEPTED=true

################################################################################
#
# Server host name
#
# The server host name. Server name should be FQDN
#
SERVER_HOSTNAME=%SERVER_HOSTNAME%

################################################################################
#
# Install user name
#
INSTALL_USER_NAME=%INSTALL_USER_NAME%

################################################################################
#
# Create user or not
#
# true:  create new user
# false: do not create new user. use existing user
#
CREATE_USER=false

Minha saída para a linha INSTALL_USER_NAME seria INSTALL_USER_NAME = USER

O problema é que as variáveis não parecem ser expandidas quando são lidas e ecoadas no arquivo.

ATUALIZAÇÃO: Solução listada abaixo

SETLOCAL ENABLEDELAYEDEXPANSION
for /F "delims=" %%a in (E:\TEMP\WindowsAdditionalServer.properties) do (
call echo %%a>>"E:\TEMP\BASE.properties"
)
    
por RMeyers 13.04.2016 / 23:45

2 respostas

0

call pode ser usado como um tipo de declaração eval.

Tente algo como

SET INSTALL_USER_NAME=USER    
for /F "delims=" %%a in (E:\TEMP\WindowsAdditionalServer.properties) do (call echo %%a>>"E:\TEMP\BASE.properties")

(não testado)

    
por 13.04.2016 / 23:59
1

A ordem de expansão é aproximadamente a seguinte:

  1. Parâmetros, por exemplo, %1 ou %*
  2. Expansão de variável normal, por exemplo, %var%
  3. FOR variáveis, por exemplo, %%V
  4. Expansão atrasada, por exemplo, !var!
  5. CHAMAR com outra rodada de expansão normal

Você pode usar o truque CALL para expandir as variáveis após a expansão da variável FOR, mas isso é relativamente lento. Melhor usar a expansão atrasada.

Você estava no caminho certo quando ativou a expansão atrasada, mas também precisa substituir ! para % no arquivo de modelo. Portanto, INSTALL_USER_NAME=%INSTALL_USER_NAME% deve ser alterado para INSTALL_USER_NAME=!INSTALL_USER_NAME! . Então tudo vai funcionar e será mais rápido.

    
por 15.04.2016 / 02:59