如何编写一个c#控制台应用程序,为该控制台设置环境变量?
我试图在命令行中创建一个要执行的命令,该命令将从外部源(heroku)中提取env变量,并更新该命令提示符的环境。我最强的语言是C语言,所以我决定编写一个控制台应用程序来实现这一点。我正在成功地从heroku获取值,但无法为控制台设置环境变量 以下是我尝试过的一些选项,但都不起作用。也许从.NET甚至都不可能如何编写一个c#控制台应用程序,为该控制台设置环境变量?,c#,C#,我试图在命令行中创建一个要执行的命令,该命令将从外部源(heroku)中提取env变量,并更新该命令提示符的环境。我最强的语言是C语言,所以我决定编写一个控制台应用程序来实现这一点。我正在成功地从heroku获取值,但无法为控制台设置环境变量 以下是我尝试过的一些选项,但都不起作用。也许从.NET甚至都不可能 foreach (var kvp in kvps) { // Works for user vars, but doesn't update the run
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();
}
查看Common7\Tools中的Visual Studio文件夹。您将找到一个批处理文件vsvars32.bat,当您运行开发人员命令提示符时,该文件用于设置环境变量。我认为您无法在.NET程序中设置环境变量,但您可以使用.NET程序生成一个.bat文件,其中包含从外部源提取的相关set语句,然后直接运行.bat文件。每个进程都从生成它的进程继承其环境。您无法更改另一个正在运行的进程的环境 但是,您可以使用此重载(假设您有权限) 若要更改注册表并在进程终止后保持环境更改,请执行以下操作 做你想做的事情的一种方法是:
- 创建一个简单的控制台应用程序,将所需的环境更改写入标准输出:
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
- 在命令shell中,执行
文件,该文件将启动应用程序来设置环境变量。完成后,将为命令shell的持续时间设置变量。在上面的示例中,在运行*.cmd
文件后运行命令*.cmd
,显示以下内容:set curr
C:\> set curr current_hh=17 current_hhmm=1705 current_hhmmss=170530 current_yyyy=2013 current_yyyymm=2013-09 current_yyyymmdd=2013-09-24
不言而喻,您的可执行文件和批处理文件包装器需要位于路径上的某个目录中。可能与@TonyHopkinson的副本非常接近,但这是直接从控制台运行的,下面的答案(实际上两者)是一个在本用例中工作的解决方案。在这个问题上,它是一个单独的构建环境,这使得事情变得更加困难(因此没有得到认可的答案)
@DateVars.exe > %temp%\_setDateVars.cmd
@%temp%\_setDateVars
C:\> set curr
current_hh=17
current_hhmm=1705
current_hhmmss=170530
current_yyyy=2013
current_yyyymm=2013-09
current_yyyymmdd=2013-09-24