目标
我们在.NET应用程序的配置文件中使用%logonserver%
和%userdomain%
等环境变量来支持应用程序管理器的配置自由。解析配置文件时,对Environment.ExpandEnvironmentVariables的调用将解析实际值。
问题
然而,它似乎无法通过以下替换来扩展环境变量:
%logonserver:~2%
(跳过前两个字符)%logonserver:\\=%
(用空字符串替换反斜杠)当我调用Environment.ExpandEnvironmentVariables("%logonserver:~2%")
时,方法只返回相同的字符串:%logonserver:~2%
,而不是像命令行调用那样的扩展和替换变量:echo %logonserver:~2%
。
问题
提前致谢。
答案 0 :(得分:1)
你没有错。冒号:
之后的所有内容都是命令shell的一个特殊功能,它不会被.Net或Win32 API模仿(只需检查this code)。
有两种可能性:
将字符串移至:
,添加百分号%
并将其提交给ExpandEnvironmentVariables()
。然后编写自己的解析器,在对返回的字符串执行冒号:
之后应用所需的操作,以模仿控制台的行为。
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;
}