在这种情况下,设置环境变量的应用程序在需要访问env.var的应用程序中执行。 Main() Return Values (C# Programming Guide) msdn文章讨论了它在批处理文件中的使用。如果我尝试一样,一切都很好;但所需要的是不是从批处理脚本运行,而是从应用程序内运行。
Process.Start("app","args"); // app sets the env.var.
string envVar = System.Environment.GetEnvironmentVariable("ERRORLEVEL");
显然不成功。 Process.Start使“app”在我认为完全不同的环境中工作。换句话说,我需要在与调用者应用程序相同的环境中运行“app”,以便达到它设置的环境变量。
答案 0 :(得分: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);
答案 1 :(得分:1)
环境变量会继承到子进程,但每个子进程都会获得一个副本 - 如果之后更改了父进程的环境,则不会反映在子进程中。
这是出于安全原因:如果共享变量,进程可能会看到彼此的内存,这会导致各种问题。
因此,解决方案是在开始新流程之前设置变量。
如果您需要与现有子流程进行通信,请使用管道。
答案 2 :(得分:1)
每个应用程序都使用它自己的环境副本运行,因此子进程不会影响父进程的环境。这一直是CreateProcess,其中环境是输入/可选参数 - 即单向。
从命名管道到套接字到共享内存到文件,有许多IPC机制可用......列表继续。
但是怀疑文件对你来说是最容易的。
您可以让子进程创建一个文件,其中包含您希望调用的应用程序可以加载和使用的名称/值对。格式可能是基本的,如:
键=值 键2 =值
有点复杂(但可能更容易使用),比如XML ......或者你想要的任何自定义格式。
答案 3 :(得分:0)
该命令必须在当前进程的环境中执行。通常,bash将作为子进程执行所有进程,该进程被赋予父对象环境的只读副本,并在修改变量时创建新条目。
Dot(。)是一个不应该与当前目录的规范混淆的命令。 dot命令使以下命令在父环境中执行。通过这种方式,进程的环境变量是调用进程的环境变量。