Variáveis de ambiente do Windows

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?

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

Blz vou tentar rsrsrs

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;

/**

  • Classe com métodos para executar comandos do Windows.

  • @author David Buzatto
    */
    public class WindowsCommandUtils {

    /**

    • Executa um comando do Windows que não está associado ao cmd.exe, ou seja,

    • qualquer executável alcançável pela configuração da variável de

    • ambiente PATH.

    • @param command Comando a ser executado.

    • @throws IOException
      */
      public static void runCommand( String command ) throws IOException {

      // executa o comando
      Process processo = Runtime.getRuntime().exec( command );

      // cria os stream gobblers, um para o stream de entrada e um para o
      // stream de erro. os gobblers vão consumir os streams do processo
      StreamGobbler sgInput = new StreamGobbler(
      processo.getInputStream(), “input” );
      StreamGobbler sgError = new StreamGobbler(
      processo.getErrorStream(), “error” );

      // cria uma thread para cada stream gobbler e as inicia
      new Thread( sgInput ).start();
      new Thread( sgError ).start();

    }

    /**

    • Executa um comando do Windows que está associado ao cmd.exe, por exemplo,

    • o comando DIR.

    • @param command Comando a ser executado.

    • @throws IOException
      */
      public static void runCmdCommand( String command ) throws IOException {

      // executa o comando do cmd.exe
      Process processo = Runtime.getRuntime().exec( "cmd /C " + command );

      // cria os stream gobblers, um para o stream de entrada e um para o
      // stream de erro. os gobblers vão consumir os streams do processo
      StreamGobbler sgInput = new StreamGobbler(
      processo.getInputStream(), “input” );
      StreamGobbler sgError = new StreamGobbler(
      processo.getErrorStream(), “error” );

      // cria uma thread para cada stream gobbler e as inicia
      new Thread( sgInput ).start();
      new Thread( sgError ).start();

    }

}
/**

  • 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