1

目标

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

问题

但是,它似乎无法使用以下替换来扩展环境变量:

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

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

问题

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

提前致谢。

4

2 回答 2

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

  2. 有两种可能:

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

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

于 2014-03-12T11:57:40.917 回答
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;
}
于 2016-04-27T18:43:26.087 回答