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

时间:2014-03-12 10:15:24

标签: c# .net environment-variables configuration-files variable-subsitution

目标

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

问题

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

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

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

问题

  1. 我有什么问题吗?
  2. 在.net?
  3. 中实现此目标的替代方法是什么?

    提前致谢。

2 个答案:

答案 0 :(得分:1)

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

  2. 有两种可能性:

    • 将字符串移至:,添加百分号%并将其提交给ExpandEnvironmentVariables()。然后编写自己的解析器,在对返回的字符串执行冒号:之后应用所需的操作,以模仿控制台的行为。

    • 带有Start a process
    • hidden console window,获取其输出和输入流,并将带有echo命令的环境变量发送给它,并让控制台完成解析。 / p>

答案 1 :(得分:1)

你可以使用这样的东西(你的里程可能很大程度上取决于用例,但这在某些情况下有用):

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;
}