在这种情况下,设置环境变量的应用程序在需要访问env.var的应用程序中执行。 Main()返回值(C#编程指南) msdn文章讨论了它在批处理文件中的使用。如果我尝试一样,一切都很好;但所需要的是不是从批处理脚本运行,而是从应用程序内运行。

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

显然不成功。 Process.Start制作了“app”。我相信在一个完全不同的环境中工作。换句话说,我需要运行“app”。在与调用者应用程序相同的环境中,以便到达它设置的环境变量。

有帮助吗?

解决方案

如果你只是想从父母那里设置孩子的环境:

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);

其他提示

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

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

因此,解决方案是在开始新流程之前设置变量。

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

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

从命名管道到套接字到共享内存到文件,有许多IPC机制可用......列表继续。

但是怀疑文件对你来说是最容易的。

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

键=值 键2 =值

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

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

Dot(。)是一个不应该与当前目录的规范混淆的命令。 dot命令使以下命令在父环境中执行。通过这种方式,进程的环境变量是调用进程的环境变量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top