如何使用替换来扩展环境变量

本文关键字:扩展 环境变量 替换 何使用 | 更新日期: 2023-09-27 17:49:58

目标

我们在.NET应用程序的配置文件中使用了%logonserver%%userdomain%等环境变量,以支持应用程序管理器的配置自由。解析配置文件时,对Environment.ExpandEnvironmentVariables的调用将解析实际值。

问题

然而,它似乎无法通过替换来扩展环境变量,如:

  • %logonserver:~2%(跳过前两个字符(
  • %logonserver:''=%(用空字符串替换反斜杠(

当我调用Environment.ExpandEnvironmentVariables("%logonserver:~2%")时,该方法只返回相同的字符串:%logonserver:~2%,而不是像命令行调用那样返回扩展和替换的变量:echo %logonserver:~2%

问题

  1. 我做错了什么吗
  2. 在.net中实现这一目标的替代方案是什么

提前谢谢。

如何使用替换来扩展环境变量

  1. 你没有做错什么。冒号:之后的所有内容都是命令shell的一个特殊功能,它不会被.Net或Win32 API模仿(只需检查此代码(。

  2. 有两种可能性:

    • 取该字符串直到:,加一个百分号%,并将其赋给ExpandEnvironmentVariables()。然后编写自己的解析器,在冒号:之后对返回的字符串应用所需的操作,以模拟控制台的行为。

    • 用一个隐藏的控制台窗口启动一个进程,获取它的输出和输入流,并向它发送带有echo命令的环境变量,让控制台完成解析。

您可能可以使用这样的东西(您的里程数可能很大程度上取决于用例,但这在某些场景中有效(:

private static string ExpandEnvironmentVariablesWithSubstitution(string value)
{
    string result = string.Empty;
    var process = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = "cmd",
            Arguments = string.Concat("/c echo ", value),
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardOutput = true
        }
    };
    process.OutputDataReceived += (s, e) => result = string.IsNullOrWhiteSpace(e.Data) ? result: e.Data;
    process.Start();
    process.BeginOutputReadLine();
    process.WaitForExit();
    process.CancelOutputRead();
    if (!process.HasExited)
        process.Kill();
    return result;
}