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)
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"
)
A ordem de expansão é aproximadamente a seguinte:
%1
ou %*
%var%
%%V
!var!
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.