是否可以在进程退出后在控制台应用程序中保留环境变量。
我希望控制台应用程序设置一个字符串,该字符串可用于执行它的批处理文件。
控制台应用程序位于dotnet中。
答案 0 :(得分:5)
您可以使用Environment.SetEnvironmentVariable:
Environment.SetEnvironmentVariable("SomeVariable", "Some value", EnvironmentVariableTarget.User);
最后一个参数将确定变量的范围和生命周期(Process,User或Machine)。如果要为机器设置变量,则需要以admin身份运行。
编辑:我注意到,如果使用上面的代码执行控制台应用程序,则在打开新的命令窗口之前环境变量不可用(因此,如果从批处理中执行控制台应用程序)文件,该变量将不可用于批处理文件,除非有一个技巧让它刷新它看到的一组环境变量。
编辑2:好的,我正在挖掘这个并且似乎没有明显的方法让批处理文件获得一组刷新的环境变量。我找到的一个解决方法是让.net代码编写一个批处理文件来设置变量,而不是自己设置它们。然后,调用批处理脚本可以运行创建的批处理文件以设置环境:
.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%
答案 1 :(得分:4)
这类似于Xiaofu的,除了您可能想要完全跳过文本文件并让您的程序将数据写入控制台。在程序名称周围打勾以让批处理文件执行它并使用输出,如下所示:
for /f "tokens=1,2 delims=," %%a in ('MyProgram.exe') do (
set %%a=%%b
set %%a=%%b
)
如果要输出应忽略的其他文本行,则可以在for循环中添加过滤器。
答案 2 :(得分:3)
由于您希望批处理文件能够读取它,因此您可能只能使用传统的环境变量。
尝试将Environment.SetEnvironmentVariable与EnvironmentVariableTarget用户或机器一起使用。然后,您应该能够从批处理文件中获取%my_var%。
之类的内容Environment.SetEnvironmentVariable("my_var", "data", EnvironmentVariableTarget.User);
编辑: Fredrik用类似的解决方案打败了我,我同意这是环境变量的已知行为。我打算让你的C#应用程序编写你想要返回文本文件的字符串,然后在你的批处理文件中解析它。例如:
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
答案 3 :(得分:0)
是,设置系统环境变量而不是流程环境变量。 (我认为从技术上讲,用户环境变量也会持续存在,但仅限于该用户的上下文。)
使用system.environment类获取SetEnvironmentVariable方法。