1

Javaプログラムからbatファイルを実行する必要があるという問題に直面しています。このバッチ ファイルには、アプリケーションのさらに下にアクセスする必要がある特定の SET ms-dos コマンドが含まれています。

ProcessBuilder クラスを使用してバッチ ファイルを呼び出しましたが、processBuilder.environment() がバッチ ファイルによって設定された変数を返してくれません。

DOS SET コマンドは、そのプロンプトでのみ変数を設定します。

この問題の解決策が見つかりません。

そのような問題に対する代替アプローチはありますか。バッチファイルを変更できません。

よろしくアベイ

4

3 に答える 3

0

ProcessBuilderインスタンスは、子プロセスによって使用される環境変数を保持します。processBuilder.environment()にある親プロセスの環境変数を参照するのではなく、参照する必要がありますSystem.getenv()

ただし、それでも一方通行であることに気付くかもしれません。そこで環境変数を設定してプロセスシェルに渡すことができますが、SETコマンドによって行われた変更はリターントリップ後も存続しません。

それで、ここに別のアプローチがあります。バッチファイルをラッパースクリプトとして記述し、stdout、stderr、ファイルなど、より簡単にアクセスできる場所に目的の変数を出力するようにします。

wrapper.bat
===========
@echo off
call "D:\build\XL_7_12\XL_7_12\build\xl_env.cmd"
echo ROOT=%ROOT%,FOLDER=%FOLDER%

次に、Javaからを呼び出し、wrapper.batprocess.getInputStream()の最後の行からROOT値とFOLDER値を収集して解析します。

于 2012-07-03T20:52:36.163 に答える
0

System.getenvを使用すると、環境変数を取得できます。このコンテキストでも機能するはずです。環境変数を返す別のバージョンがあります。Map

于 2012-07-03T14:58:06.953 に答える
0

もう 1 つの方法は、ECHO コマンドの出力をファイルにリダイレクトし、後でこれを Java から読み取ることです。例えば。

echo ROOT=%ROOT%,FOLDER=%FOLDER% > \temp\vars.txt

次に、Java から \temp\vars.txt を読み取ります。これは、入力ストリームを読み取るよりも少し簡単かもしれません。最後に、wrapper.bat ファイルの代わりに、command.exe インターパーターの 1 つのコピーに 2 つのコマンドを発行して、環境を共有できることに注意してください。

D:\build\XL_7_12\XL_7_12\build\xl_env.cmd & ECHO %ROOT% > \temp\vars.txt
于 2012-07-06T15:11:35.177 に答える