代码之家  ›  专栏  ›  技术社区  ›  Herman Cordes

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

  •  1
  • Herman Cordes  · 技术社区  · 11 年前

    球门

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

    问题

    然而,它似乎不能用替换来扩展环境变量,例如:

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

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

    问题

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

    提前感谢。

    2 回复  |  直到 11 年前
        1
  •  1
  •   Community CDub    7 年前
    1. 你没做错什么。结肠后的所有东西 : 是命令shell的一个特殊功能,不会被.Net或Win32 API模仿(只需检查 this code ).

    2. 有两种可能性:

      • 拿着绳子直到 : ,添加百分号 % 把这个给 ExpandEnvironmentVariables() 。然后编写自己的解析器,在冒号后应用所需的操作 : 在返回的字符串上执行,以模拟控制台的行为。

      • Start a process 用一个 hidden console window ,获取其输出和输入流,并使用 echo 命令,并让控制台完成解析。

        2
  •  1
  •   grenade    8 年前

    您可能可以使用类似的方法(您的里程可能非常依赖于用例,但这在某些情况下有效):

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