如何编写为该控制台设置 env 变量的 c# 控制台应用
本文关键字:控制台 变量 应用 env 设置 何编写 | 更新日期: 2023-09-27 18:32:50
我正在尝试创建一个要从命令行中执行的命令,该命令将从外部源(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();
}
每个进程都从生成它的进程继承其环境。您无法更改另一个正在运行的进程的环境。
但是,您可以使用此重载(假设您具有权限(
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
文件,该文件将触发您的应用程序以设置环境变量。完成后,将在命令外壳的持续时间内设置变量。在上面的示例中,在*.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
这是*nix的方式。容易!
不用说,您的可执行文件和批处理文件包装器需要位于路径上某处的目录中。
查看 Common7''Tools 中的 Visual Studio 文件夹。 你将找到一个批处理文件 vsvars32.bat,该文件用于在运行开发人员命令提示符时设置环境变量。 我认为您无法从 .NET 程序中设置环境变量,但您可以使用 .NET 程序生成一个包含从外部源中提取的相关 set 语句的.bat文件,然后直接运行.bat文件。