1

我正在尝试创建一个要从命令行中执行的命令,该命令将从外部源(heroku)中提取环境变量并更新该命令提示符的环境。我最擅长的语言是 C#,所以我决定编写一个控制台应用程序来做到这一点。我已成功从 heroku 获取值,但无法为控制台设置环境变量。

以下是我尝试过的一些选项,但没有一个有效。也许 .NET 甚至不可能

    foreach (var kvp in kvps)
    {
        // Works for user vars, but doesn't update the running console
        Environment.SetEnvironmentVariable(kvp.Key, kvp.Value, EnvironmentVariableTarget.User);

        // Seems to have no effect.  My guess is it only applies to the C# app itself, not the console.
        Environment.SetEnvironmentVariable(kvp.Key, kvp.Value, EnvironmentVariableTarget.Process);

        // Opens a bunch of windows but doesn't accomplish anything
        new Process
        {
            StartInfo = new ProcessStartInfo(@"cmd.exe", "set " + kvp.Key + "=" + kvp.Value)
        }.Start();

        // Throws "file not found" exception
        new Process
        {
            StartInfo = new ProcessStartInfo(@"set", kvp.Key + "=" + kvp.Value)
        }.Start();
    }
4

2 回答 2

1

查看 Common7\Tools 中的 Visual Studio 文件夹。您会找到一个批处理文件 vsvars32.bat,它是在您运行开发人员命令提示符时用于设置环境变量的文件。我认为您无法从 .NET 程序中设置环境变量,但您可以使用 .NET 程序生成一个 .bat 文件,其中包含从外部源提取的相关 set 语句,然后直接运行 .bat 文件。

于 2013-09-24T23:47:05.423 回答
1

每个进程都从生成它的进程继承其环境。您没有能力改变另一个正在运行的进程的环境。

但是,您可以使用此重载(假设您有权限)

Environment.SetEnvironmentVariable( string , string , EnvironmentVariableTarget )

在进程终止后更改注册表并保留环境更改。

做你想做的事情的一种方法是:

  • 创建一个简单的控制台应用程序,将您所需的环境更改写入stdout

    static void Main( string[] args )
    {
        DateTime dtNow = DateTime.Now ;
        Console.WriteLine( "@set current_yyyymmdd={0:yyyy-MM-dd}" , dtNow ) ;
        Console.WriteLine( "@set current_yyyymm={0:yyyy-MM}" , dtNow ) ;
        Console.WriteLine( "@set current_yyyy={0:yyyy}" , dtNow );
        Console.WriteLine( "@set current_hhmmss={0:HHmmss}" , dtNow ) ;
        Console.WriteLine( "@set current_hhmm={0:HHmm}" , dtNow ) ;
        Console.WriteLine( "@set current_hh={0:HH}" , dtNow );
        return ;
    }
    
  • 通过像这样的批处理文件包装器在命令行上调用它*.cmd(假设你的时髦的新应用程序被调用DateVars.exe):

    @DateVars.exe > %temp%\_setDateVars.cmd
    @%temp%\_setDateVars
    
  • 从您的命令外壳,执行您的*.cmd文件,这将启动您的应用程序以设置环境变量。完成后,将在命令 shell 的持续时间内设置变量。在上面的示例中,set curr在文件运行后运行命令会*.cmd显示以下内容:

    C:\> set curr
    current_hh=17
    current_hhmm=1705
    current_hhmmss=170530
    current_yyyy=2013
    current_yyyymm=2013-09
    current_yyyymmdd=2013-09-24
    

这是 *nix 方式。简单的!

不用说,您的可执行文件和批处理文件包装器需要位于路径中某处的目录中。

于 2013-09-25T00:11:08.640 回答