4

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

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

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

4

4 回答 4

6

您可以使用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%
于 2009-05-29T05:32:01.257 回答
4

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

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

如果要输出应忽略的其他文本行,则可以在 for 循环内添加过滤器。

于 2010-01-27T19:35:45.163 回答
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
于 2009-05-29T05:33:56.340 回答
0

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

使用 system.environment 类获取 SetEnvironmentVariable 方法。

于 2009-05-29T05:32:42.813 回答