2009-05-29 85 views
3

是否有可能在进程退出后可用的控制台应用程序中保留环境变量。应用程序退出后保留环境变量

我想要一个控制台应用程序来设置一个字符串,可用于执行它的批处理文件。

控制台应用程序在dotnet中。

回答

5

可以使用Environment.SetEnvironmentVariable

Environment.SetEnvironmentVariable("SomeVariable", "Some value", EnvironmentVariableTarget.User); 

最后一个参数将决定变量(过程,用户或机器)的范围和寿命。如果您想为机器设置变量,则需要以管理员身份运行。

编辑:我注意到的是,如果执行与上面的代码控制台应用程序,直到你打开一个新的命令行窗口(环境变量不适用,因此,如果从一个批处理文件执行控制台应用程序,该变量将不可用于该批处理文件,除非有技巧让它刷新它所看到的一组环境变量)。

编辑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% 
+0

你打败了我。我认为这是一个很好的解决方案,我的答案略有不同。我认为没有其他“好”的方法。 – Xiaofu 2009-05-29 06:31:02

+0

这个解决方案效果很好,可惜这个环境变量有这个限制,但是一个解决方法是可行的。 – benPearce 2009-06-01 03:24:57

0

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

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

3

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

尝试使用Environment.SetEnvironmentVariable与用户或机器的EnvironmentVariableTarget。然后,您应该能够从批处理文件中获取类似于%my_var%的内容。

Environment.SetEnvironmentVariable("my_var", "data", EnvironmentVariableTarget.User); 

编辑:弗雷德里克有打我给它一个类似的解决方案,我同意,这被称为行为的环境变量。我打算建议让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 
4

这类似于晓芙的,除了你可能想完全跳过的文本文件,让你的程序写数据传送到控制台。把蜱周围的节目名称有批处理文件来执行它,并使用输出,这样的:如果你想

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

文本的输出其他行应该被忽略,那么你可以添加里面的一个过滤器for循环。