Leia variáveis de ambiente do arquivo no Windows Batch (cmd.exe)
-
04-07-2019 - |
Pergunta
Estou tentando ler variáveis de um arquivo em lote para uso posterior no script em lote, que é um iniciador Java.O ideal seria ter o mesmo formato para o arquivo de configurações em todas as plataformas (Unix, Windows) e também ser um arquivo de propriedades Java válido.Ou seja, deve ficar assim:
setting1=Value1
setting2=Value2
...
É possível ler esses valores como faria em um script de shell Unix?O poderia ser algo assim:
READ settingsfile.xy
java -Dsetting1=%setting1% ...
Eu sei que isso provavelmente é possível com SET setting1=Value1
, mas prefiro ter o mesmo formato de arquivo para as configurações em todas as plataformas.
Esclarecer:Preciso fazer isso no ambiente de linha de comando/lote, pois também preciso definir parâmetros que não podem ser alterados na JVM, como -Xmx ou -classpath.
Solução
Você pode fazer isso em um arquivo em lote da seguinte maneira:
setlocal
FOR /F "tokens=*" %%i in ('type Settings.txt') do SET %%i
java -Dsetting1=%setting1% ...
endlocal
Isto lê um arquivo de texto contendo strings como "SETTING1=VALUE1" e chama SET para defini-las como variáveis de ambiente.
setlocal/endlocal são usados para limitar o escopo das variáveis de ambiente para a execução do seu arquivo em lote.
O Processador de Comando CMD é bastante poderoso, embora com uma sintaxe bastante bizantina.
Outras dicas
Você pode passar o arquivo de propriedades como parâmetro para um programa Java (que pode iniciar o programa principal posteriormente).E então aproveite o paradigma multiplataforma.
Pode ser aconselhável importar apenas variáveis específicas de um arquivo de propriedades (aquelas que você conhece antecipadamente); nesse caso, recomendo uma função como a seguinte:
:parsePropertiesFile
set PROPS_FILE=%1
shift
:propLoop
if "%1"=="" goto:eof
FOR /F "tokens=*" %%i in ('type %PROPS_FILE% ^| findStr.exe "%1="') do SET %%i
shift
GOTO propLoop
goto:eof
Que seria chamado por call:parsePropertiesFile props.properties setting1 setting2
para definir as variáveis setting1 e setting2
Você também pode acessar as variáveis de ambiente do sistema operacional de dentro de um programa Java:
import java.util.Map;
public class EnvMap {
public static void main (String[] args) {
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n", envName, env.get(envName));
}
}
}