我正在尝试从命令行中创建一个命令,该命令将从外部源(heroku)提取env变量并更新该命令提示符的环境。我最强的语言是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();
}
答案 0 :(得分:1)
查看Common7 \ Tools中的Visual Studio文件夹。您将找到一个批处理文件vsvars32.bat,它是在运行开发人员命令提示符时用于设置环境变量的文件。我认为您无法在.NET程序中设置环境变量,但您可以使用.NET程序生成包含从外部源中提取的相关set语句的.bat文件,然后直接运行.bat文件。
答案 1 :(得分: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
从您的命令shell中,执行您的*.cmd
文件,该文件将启动您的app以设置环境变量。完成后,将在命令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的方式。简单!
不言而喻,您的可执行文件和批处理文件包装器必须位于路径某处的目录中。