从c#中的新进程中获取环境变量

时间:2015-09-18 10:45:03

标签: c# .net process environment-variables

我有一个c#应用程序,它会生成一个新的Process,其中设置了一个环境变量。在c#应用程序中,在进程运行期间,我想访问该变量。

源代码如下:

        Process p = new Process();
        p.StartInfo.FileName = "cmd.exe";
        p.StartInfo.Arguments = "/c " + "\"" + "set MYSPECIALENV=someContent & set & pause" + "\"";
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.UseShellExecute = true;

        Console.WriteLine("Starting process");
        p.Start();
        ICollection envVarsSpawnedProcess = p.StartInfo.EnvironmentVariables.Keys;

        if (envVarsSpawnedProcess.Cast<string>().Contains("MYSPECIALENV"))
        {
            Console.WriteLine("Found! :)");
        }
        else
        {
            Console.WriteLine("Not found :(");

        }

        p.WaitForExit();

此示例以某种方式简化,因为在我的实际应用程序中,我执行一个动态设置特定环境的命令脚本,但此代码段将其降至最低。

关键是我需要访问在生成的进程中定义的环境变量,我需要从c#应用程序访问它。

但是,我从ProcessStartInfo对象获取的环境变量列表似乎没有反映新创建的环境变量“mySpecialEnv”。

我的第一个疑问是,ProcessStartInfo可能并不真正访问进程的环境代码块,而只是从注册表中获取信息。有人能证实吗?我用Google搜索了很长时间,但未找到确认信息......

我的第二个疑问是我遇到了竞争条件(例如我试图过早地访问环境变量),但即使使用实施的轮询机制,我也没有得到更好的结果。

用纯粹的.net可以实现这种方式吗? 1)Spawn过程,它创建一个新的环境变量 2)从c#应用程序

访问/读取此环境变量

非常感谢你!

1 个答案:

答案 0 :(得分:0)

在p.start()之后,你需要等到它完成整个过程

然后你需要启动另一个进程来检查你的环境变量。

Process p = new Process();
    p.StartInfo.FileName = "cmd.exe";
    p.StartInfo.Arguments = "/c " + "\"" + "set MYSPECIALENV=someContent & set & pause" + "\"";
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.UseShellExecute = true;

    Console.WriteLine("Starting process");
    p.Start();
    p.WaitForExit();
    ICollection envVarsSpawnedProcess = p.StartInfo.EnvironmentVariables.Keys;

    if (envVarsSpawnedProcess.Cast<string>().Contains("MYSPECIALENV"))
    {
        Console.WriteLine("Found! :)");
    }
    else
    {
        Console.WriteLine("Not found :(");

    }