代码之家  ›  专栏  ›  技术社区  ›  tafa

应用程序如何访问由其他应用程序设置的环境变量?

  •  4
  • tafa  · 技术社区  · 15 年前

    在这种情况下,设置环境变量的应用程序在需要访问env.var的应用程序中/从中执行。 这个 Main() Return Values (C# Programming Guide) MSDN文章讨论了它在批处理文件中的使用。如果我尝试相同的方法,一切都很好;但是所需要的不是从批处理脚本运行,而是从应用程序内部运行。

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

    显然失败了。开始让“应用程序”在一个完全不同的环境中工作。换句话说,我需要在与调用者应用程序相同的环境中运行“app”,以便访问它设置的环境变量。

    4 回复  |  直到 7 年前
        1
  •  6
  •   Oliver Mellet    15 年前

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

    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);
    
        2
  •  1
  •   Aaron Digulla    15 年前

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

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

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

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

        3
  •  1
  •   Robert Horvick    15 年前

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

    从命名管道到套接字,到共享内存到文件,有许多可用的IPC机制…名单还在继续。

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

    您可以让子进程创建一个包含所需名称/值对的文件,然后调用应用程序可以加载并使用该文件。格式可以是基本的,比如:

    密钥=值 KEY2= Value2

    有点复杂(但可能更容易使用),比如XML…或任何自定义格式。

        4
  •  0
  •   neo    7 年前

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

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