.net 在应用程序退出后保留环境变量

.net 在应用程序退出后保留环境变量,.net,environment-variables,.net,Environment Variables,是否可以在进程退出后可用的控制台应用程序中持久化环境变量 我希望控制台应用程序设置一个字符串,该字符串可用于执行该字符串的批处理文件 控制台应用程序位于dotnet中。您可以使用: 最后一个参数将确定变量(进程、用户或机器)的范围和生存期。如果要为机器设置变量,则需要以管理员身份运行 编辑:我注意到,如果使用上述代码执行控制台应用程序,则在打开新的命令窗口之前,环境变量不可用(因此,如果从批处理文件执行console应用程序,该变量将不可用于批处理文件,除非有技巧让它刷新它看到的环境变量集) 编

是否可以在进程退出后可用的控制台应用程序中持久化环境变量

我希望控制台应用程序设置一个字符串,该字符串可用于执行该字符串的批处理文件

控制台应用程序位于dotnet中。

您可以使用:

最后一个参数将确定变量(进程、用户或机器)的范围和生存期。如果要为机器设置变量,则需要以管理员身份运行

编辑:我注意到,如果使用上述代码执行控制台应用程序,则在打开新的命令窗口之前,环境变量不可用(因此,如果从批处理文件执行console应用程序,该变量将不可用于批处理文件,除非有技巧让它刷新它看到的环境变量集)

编辑2:好的,我一直在研究这个问题,似乎没有明显的方法让批处理文件获得一组刷新的环境变量。我发现的一个解决方法是让.net代码编写一个批处理文件来设置变量,而不是自己设置变量。然后调用批处理脚本可以运行create已编辑批处理文件以设置环境:

.Net控制台应用程序:

static void Main(string[] args)
{
    string outputFile = @"c:\temp\setvars.bat";
    string variable = "set SomeVariable=Some value";
    File.WriteAllText(outputFile, variable);
}
BAT文件:

call myconsoleapp.exe
call c:\temp\setvars.bat
echo %SomeVariable%

是的,设置一个系统环境变量而不是流程环境变量(我认为从技术上讲,用户环境变量也会持续存在,但仅适用于该用户的上下文)


使用system.environment类访问SetEnvironmentVariable方法。

由于您希望批处理文件能够读取它,因此可能仅限于使用传统的环境变量

尝试与一个用户或计算机的类型一起使用。然后,您应该能够使用%my_var%之类的内容从批处理文件中获取它

Environment.SetEnvironmentVariable("my_var", "data", EnvironmentVariableTarget.User);
编辑:Fredrik在那里用类似的解决方案击败了我,我同意这是环境变量的已知行为。我打算让你的C#app编写你想要返回到文本文件的字符串,然后在你的批处理文件中解析它。例如:

for /f "tokens=1,2 delims=," %%a in (data.txt) do (
if %%a==env1 echo %%b
if %%a==env2 echo %%b
)
…其中data.txt可能看起来像:

env1,hello
env2,there

这与Xiaofu的类似,只是您可能希望完全跳过文本文件,让程序将数据写入控制台。在程序名周围打勾,让批处理文件执行它并使用输出,如下所示:

for /f "tokens=1,2 delims=," %%a in ('MyProgram.exe') do (
    set %%a=%%b
    set %%a=%%b
)

如果你想输出其他应该忽略的文本行,那么你可以在for循环中添加一个过滤器。

你比我强。我认为这是一个很好的解决方案,我在回答中对此有一个稍微不同的理解。我不认为有任何其他“好”的方法。这个解决方案工作得很好,可惜有这个限制请在环境变量上单击,但解决方法可以。这不会超出流程的范围。一旦退出,环境变量将无法从调用它的脚本中获得。但是,我不确定“系统环境变量”指的是什么EnvironmentVariableTarget枚举仅具有值Process、User和Machine。Process变量仅在进程的作用域内持续存在。用户环境变量存储在HKCU中,并在为该用户创建进程时加载。System(Machine)变量存储在HKLM中,并在该逻辑机器中创建任何shell进程时加载。
for /f "tokens=1,2 delims=," %%a in ('MyProgram.exe') do (
    set %%a=%%b
    set %%a=%%b
)