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

每个应用程序都使用自己的环境副本运行,因此子进程不能影响父进程的环境。一直到 CreateProcess 都是如此,其中环境是输入/可选参数 - 即单向。

您可以使用许多 IPC 机制,从命名管道到套接字到共享内存再到文件……不胜枚举。

但是怀疑文件对你来说是最简单的。

您可以让子进程创建一个文件,其中包含您想要的名称/值对,然后调用应用程序可以加载和使用该文件。格式可能是基本的,例如:

键=值键2=值2

更复杂一点(但可能更容易使用),例如 XML ...或您想要的任何自定义格式。

于 2009-06-18T15:39:59.803 回答
1

环境变量被继承给子进程,但每个子进程都会获得一个副本 - 如果您之后更改父进程的环境,这将不会反映在子进程中。

这是出于安全原因:如果变量是共享的,则进程可以查看彼此的内存,这会导致各种问题。

所以解决方法是在开始新进程之前设置变量。

如果您需要与现有的子进程通信,请使用管道。

于 2009-06-18T15:35:08.237 回答
0

该命令必须在当前进程的环境中执行。通常,bash 会将所有进程作为子进程执行,该子进程将获得父环境的只读副本,并在修改变量时创建一个新条目。

点 (.) 是一个不应与当前目录的规范混淆的命令。dot 命令导致在父环境中执行以下命令。这样,进程的环境变量就是调用进程的环境变量。

于 2017-10-18T12:39:50.343 回答