Olá turma, estou com um problema serio, tenho uma variável de ambiente criada no Windows chamada DFPATH, utilizada por um programa chamado FLEXODBC para acessar uma base de dados em DATAFLEX.
A questão é a seguinte, os valores desta variável deve ser alterada em tempo de execução, pois são elas que definem o local dos dados. Sendo assim a mudança dos valores desta variável e de suma importância para que possa acessar os dados corretamente.
Se alguém souber uma maneira de mudar estas variáveis em tempo de execução, por favor, fico muito grato.
Abraço
Jose Neto
Pode ser feito em qualquer linguagem?
Qual o sistema operacional?
Quando a troca deve ocorrer e qual valor ela deve receber?
[quote=fabiozanardi]Pode ser feito em qualquer linguagem?
Qual o sistema operacional?
Quando a troca deve ocorrer e qual valor ela deve receber?[/quote]
São variaveis de ambiente do windows (pode ser qualquer versão), quero mudar os valores pelo JAVA em tempo de execução.
Precisa ser uma variavel de ambiente ?
Não pode ser utilizado o registro do windows, ou ainda um arquivo properties ao invés da variável de ambiente ?
[quote=emanuelCruz]Precisa ser uma variavel de ambiente ?
Não pode ser utilizado o registro do windows, ou ainda um arquivo properties ao invés da variável de ambiente ?
[/quote]
Pior que não, ele só aceita as variáveis de ambiente!!!
[quote=jaimbiriba][quote=emanuelCruz]Precisa ser uma variavel de ambiente ?
Não pode ser utilizado o registro do windows, ou ainda um arquivo properties ao invés da variável de ambiente ?
[/quote]
Pior que não, ele só aceita as variáveis de ambiente!!![/quote]
Aí complica … hehehe
Veja se te ajuda:
http://stackoverflow.com/questions/318239/how-do-i-set-environment-variables-from-java
Você quer, a partir da sua aplicação Java, alterar uma variável de ambiente que é usada por outro programa?
É isso?
[quote=davidbuzatto]Você quer, a partir da sua aplicação Java, alterar uma variável de ambiente que é usada por outro programa?
É isso?[/quote]
É exatamente isso, mudo a variavel do windows e depois executo o FLEXODBC, um odbc para DATAFLEX depois disso leio os dados de acordo com os valores setados na variavel.
Dá uma olhada aqui: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true
Acho que resolve.
Pelo seu programa em Java, vc deve exectar o comando
cmd /C set nomeDaVariavel = novoValor
[quote=davidbuzatto]Dá uma olhada aqui: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true
Acho que resolve.
Pelo seu programa em Java, vc deve exectar o comando
cmd /C set nomeDaVariavel = novoValor
Eetendi a logica, mas o SET nao funciona em um public void teste () { set DFPATH=“C:”; } da erro.
Pera ai… Falei besteira.
Não, não é assim que você deve fazer.
Você vai executar o comando usando um processo.
Pera ai… Estou testando aqui…
Pergunta. A variável é do usuário ou do sistema?
Bem, vamos lá.
Depois de pesquisar um pouco…
O comando a ser usado é o SETX.
No Windows 7, o comando é disponibilizado na instalação padrão. Na verdade não é um comando do cmd, mas sim um programa, sendo assim não precisa invocar o cmd.
No Windows Vista e anteriores, vc precisa instalar o Windows Power Shell. Procure no google pela versão correspondente ao seu Windows.
Para testar, abra um prompt de comando e digite:
Se for variável do sistema:
SETX /M nomeDaVariavel novoValor
Se for variável do usuário:
SETX nomeDaVariavel novoValor
Abra as variáveis de ambiente pelo Sistema e verifique se o valor mudou.
Mesmo o Windows sendo case insensitive, entre com o valor do nome da variável igualzinho (inclusive a caixa alta ou baixa).
Vou preparar o programa agora para vc…
Funcionando da 1 OK pq fiquei curioso também hehe
Ta ai.
Classe com os métodos utilitários para executar os comandos do Windows.
Crie um arquivo com a classe no seu projeto (nome WindowsCommandUtils.java) e cole o código abaixo.
[code]import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
}
/**
-
Thread para consumir os streams de processos.
-
Baseada na implementação apresentada em:
-
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
-
-
@author David Buzatto
*/
class StreamGobbler implements Runnable {
private InputStream is;
private String type;
private FileWriter fw;
public StreamGobbler( InputStream is, String type ) {
this.is = is;
this.type = type;
}
public StreamGobbler( InputStream is, String type, File file )
throws IOException {
this.is = is;
this.type = type;
this.fw = new FileWriter( file );
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader( is );
BufferedReader br = new BufferedReader( isr );
String line = null;
while ( ( line = br.readLine() ) != null ) {
if ( fw != null ) {
fw.write( line + “\n” );
} else {
System.out.println( type + “>” + line );
}
}
if ( fw != null ) {
fw.close();
}
} catch ( IOException ioe ) {
ioe.printStackTrace();
}
}
}[/code]
Para usar:
[code]/**
*
-
@author David Buzatto
*/
public class Teste {
public static void main( String[] args ) {
try {
WindowsCommandUtils.runCommand( "SETX /M DFPATH NOVO_VALOR_AQUI" );
} catch ( IOException exc ) {
exc.printStackTrace();
}
}
}[/code]
Ah, faltou falar. Se o SETX não encontrar a variável especificada, ele vai criá-la.
Testa ai e veja se funcionou.
[]'s
Caro davidbuzatto voce é o cara, problema resolvido, fico muito grato pela sua ajuda.
Muito obrigado mesmo.
Qualquer coisa é so chamar, afinal devo esta.
Abraço e um bom carnaval…
[quote=jaimbiriba]Caro davidbuzatto voce é o cara, problema resolvido, fico muito grato pela sua ajuda.
Muito obrigado mesmo.
Qualquer coisa é so chamar, afinal devo esta.
Abraço e um bom carnaval…[/quote]
Bom carnaval p/ vc tbm!
[]'s