2017-02-08 14 views
1

Windows環境で事前に環境変数値が必要なコマンドを実行する必要があります。実行がENVARが設定されていないエラーを与えるとき、私は、このENVVARが設定されているが環境変数をJavaコードから設定して、この変数をワークスペースを再起動せずに使用する方法

Process p = Runtime.getRuntime().exec("cmd.exe","/c","setx","ENVVAR","somevalue"); 
p=Runtime.getRuntime().exec("cmd.exe","/c","COMMANDTHATUSEENVAR"); 

を使用してみましたが、次のコマンドを実行します。これで私のワークスペースを再起動して上記のコードを実行すると、ENVAR値がうまくいきます。しかし、問題は毎回自分のワークスペースを再起動できないことです。環境変数を設定し、ワークスペースを再起動しなくてもその値を使用できる解決策があります。

+0

ようなものが必要でしょうか? – GhostCat

+0

Eclipse IDEの再起動を意味する – user3789902

答えて

1

デフォルトでは、環境ブロックは親プロセスから子プロセスにコピーされますが、開始するプロセスの環境コピーを変更することができます。 ProcessBuilder内で開始

public class EnvironmentTest 
{ 
    public static void main(String[] args) throws Exception 
    { 
     ProcessBuilder pb = new ProcessBuilder(
      "CMD.exe" 
      , "/C" 
      , "start \"\" cmd /c \"set e & pause\"" 
     ); 
     pb.environment().put("ENVVAR", "This is a test"); 
     Process p = pb.start(); 
    } 
} 

cmdインスタンスが定義されている環境変数を持っています。これを表示するには、変数の値を画面に表示する別のインスタンス(start "" cmd ...)を開始しています。

おそらくあなたのケースでは、あなたがあなたの「ワークスペース」を再起動するとはどういう意味ですか

public class EnvironmentTest 
{ 
    public static void main(String[] args) throws Exception 
    { 
     ProcessBuilder pb = new ProcessBuilder(
      "CMD.exe" 
      , "/C" 
      , "start \"\" \"COMMANDTHATUSEEN‌​VAR\"" 
     ); 
     pb.environment().put("ENVVAR", "This is a test"); 
     Process p = pb.start(); 
    } 
} 
+0

ENVARをput()に設定し、新しい環境変数のコピーを持つ新しいプロセスで、2番目のコマンドを指定したProcessBuilderとして実行します。pb = new ProcessBuilder( "CMD .exe " "、/ C " 、" start \ "\" cmd/c \ "e&pauseを設定\" " ); pb.environment()。put( "ENVVAR"、 "これはテストです"); プロセスp = pb.start(); p = Runtime.getRuntime()。exec( "cmd.exe"、 "/ c"、 "COMMANDTHATUSEENVAR"); – user3789902

+0

上記の方法でENVARを設定できましたが、ENVARが設定されていないというエラーが出ます。 – user3789902

+0

@ user3789902、いいえ、2つの異なるプロセスを作成すると、それぞれ異なる環境ブロックが作成されます。変数を定義したプロセスからプロセスを開始する必要があります。 –

2

あなたは/ Vオプションを試してみてください、とのように、構築された単一コマンドに試みることができるexample

cmd /V /C "set EDITOR=vim&& echo !EDITOR!" 

だから、私の提案:最初のコマンドに必要なものを行い、その文字列を構築ライン。そしてそれをJava ProcessBuilderで動作するものに変換します。

また、ENVAR値を引数とする単純なバッチスクリプトを作成することもできます。 ENVARを設定してツールを実行します。

最後に、問題はProcessBuilderがforkという新しいプロセスになるということです。後で別のプロセスを強制終了すると、は表示されず、が表示されます。あなたのEclipseを再起動すると、それは完全に新しいプロセスで実行され、最初のシステムコールによって行われた更新が表示されます。

関連する問題