目标
我们在.NET应用程序的配置文件中使用了%logonserver%
和%userdomain%
等环境变量,以支持应用程序管理器的配置自由。解析配置文件时,对Environment.ExpandEnvironmentVariables的调用将解析实际值。
问题
然而,它似乎无法通过替换来扩展环境变量,如:
%logonserver:~2%
(跳过前两个字符(%logonserver:\=%
(用空字符串替换反斜杠(
当我调用Environment.ExpandEnvironmentVariables("%logonserver:~2%")
时,该方法只返回相同的字符串:%logonserver:~2%
,而不是像命令行调用那样返回扩展和替换的变量:echo %logonserver:~2%
。
问题
- 我做错了什么吗
- 在.net中实现这一目标的替代方案是什么
提前谢谢。
-
你没有做错什么。冒号
:
之后的所有内容都是命令shell的一个特殊功能,它不会被.Net或Win32 API模仿(只需检查此代码(。 -
有两种可能性:
-
取该字符串直到
:
,加一个百分号%
,并将其赋给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;
}