4

この場合、環境変数を設定するアプリケーションは、env.varにアクセスする必要のあるアプリケーションとの間で実行されます。Main()の戻り値(C#プログラミングガイド) msdnの記事では、バッチファイル内での使用について説明しています。私が同じことを試みれば、すべてがうまくいきます。ただし、必要なのは、バッチスクリプトからではなく、アプリケーション内から実行することです。

Process.Start("app","args"); // app sets the env.var.
string envVar = System.Environment.GetEnvironmentVariable("ERRORLEVEL");

明らかに失敗しました。Process.Startは、私が信じるまったく異なる環境で「アプリ」を機能させました。つまり、設定した環境変数に到達するには、呼び出し元のアプリケーションと同じ環境で「app」を実行する必要があります。

4

4 に答える 4

6

親から子の環境を設定しようとしているだけの場合:

var p = new Process();
p.StartInfo.EnvironmentVariables["TEST_ENV"] = "From parent";
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = @"C:\src\bin\Debug\ChildProc.exe";
p.Start();

子に親プロセス環境を継承させたくない場合:

var psi = new ProcessStartInfo();
psi.EnvironmentVariables["TEST_ENV"] = "From parent";
psi.UseShellExecute = false;
psi.FileName = @"C:\src\bin\Debug\ChildProc.exe";
Process.Start(psi);
于 2009-06-18T19:12:00.900 に答える
1

環境変数は子プロセスに継承されますが、各子はコピーを取得します。後で親の環境を変更した場合、これは子に反映されません。

これはセキュリティ上の理由によるものです。変数が共有されている場合、プロセスは互いのメモリを調べて、あらゆる種類の問題を引き起こす可能性があります。

したがって、解決策は、新しいプロセスを開始する前に変数を設定することです。

既存の子プロセスと通信する必要がある場合は、パイプを使用してください。

于 2009-06-18T15:35:08.237 に答える
1

各アプリケーションは独自の環境のコピーで実行されるため、子プロセスが親の環境に影響を与えることはありません。これは、環境が入力/オプションのパラメーターであるCreateProcessに至るまで、つまり一方向に当てはまります。

名前付きパイプからソケット、共有メモリ、ファイルまで、利用できるIPCメカニズムはたくさんあります...リストは続きます。

しかし、ファイルがあなたにとって最も簡単になるのではないかと疑っています。

子プロセスに、呼び出し元のアプリケーションがロードして使用できる名前と値のペアを含むファイルを作成させることができます。形式は、次のような基本的なものにすることができます。

key = value key2 = value2

XMLのようにもう少し複雑です(ただし、操作は簡単かもしれません)...または任意のカスタム形式。

于 2009-06-18T15:39:59.803 に答える
0

コマンドは、現在のプロセスの環境内で実行する必要があります。通常、bashはすべてのプロセスを子プロセスとして実行します。子プロセスには親の環境の読み取り専用コピーが与えられ、変数が変更されるたびに新しいエントリが作成されます。

ドット(。)は、現在のディレクトリの指定と混同しないようにするコマンドです。dotコマンドを使用すると、親の環境内で次のコマンドが実行されます。このように、プロセスの環境変数は、呼び出し元のプロセスの環境変数です。

于 2017-10-18T12:39:50.343 に答える