解析窗口“IPCONFIG / ALL”输出(Parsing windows 'ipconf

2019-10-17 18:34发布

我有一点麻烦解析的“IPCONFIG / ALL”使用正则表达式的输出。 目前我使用使用RegexBuddy测试,但我想使用C#.NET的正则表达式。

我的输出是:

Ethernet adapter Yes:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : MAC Bridge Miniport
   Physical Address. . . . . . . . . : 02-1F-29-00-85-C9
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   Link-local IPv6 Address . . . . . : fe80::f980:c9c3:a574:37a%24(Preferred)
   Link-local IPv6 Address . . . . . : fe80::f980:c9c3:a574:37a7%24(Preferred)
   Link-local IPv6 Address . . . . . : fe80::f980:c9c3:a574:37a8%24(Preferred)
   IPv4 Address. . . . . . . . . . . : 10.0.0.1(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.0.0
   IPv4 Address. . . . . . . . . . . : 172.16.0.1(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 172.16.0.254
   DHCPv6 IAID . . . . . . . . . . . : 520228888
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-17-1C-CC-CF-00-1F-29-00-85-C9
   DNS Servers . . . . . . . . . . . : 192.162.100.15
                                       192.162.100.16
   NetBIOS over Tcpip. . . . . . . . : Enabled

到目前为止,我已经写的正则表达式为:

([ -~]+):.+(?:Description\s)(?:\.|\s)+:\s([ -~]+).+(?:Physical Address)(?:\.|\s)+:\s([ -~]+).+(?:DHCP Enabled)(?:\.|\s)+:\s([ -~]+).+(?:(?:Link-local IPv6 Address)(?:\.|\s)+:\s([ -~]+).+Preferred.+)+

问题是,我想捕获所有有用的领域群体,很容易让他们在C#中,出于某种原因 - 当我捕捉到多个“链路本地IPv6地址”字段,它停止工作。

我要感谢所有帮助,谢谢。

编辑:另一个问题是,我收到了IPCONFIG数据从远程计算机(有一个非托管的程序有哪些我没有控制) - 因此,我不能使用WMI或类似的东西来获得另一个IPCONFIG信息方式。

Answer 1:

为什么要使用正则表达式? 您的意见是简单的键值格式。 使用的东西沿着线

foreach (var line in lines)
{
   var index  = line.IndexOf (':') ;
   if (index <= 0) continue ; // skip empty lines

   var key   = line.Substring (0,  index).TrimEnd (' ', '.') ;
   var value = line.Substring (index + 1).Replace ("(Preferred)", "").Trim () ;
}


Answer 2:

但我想使用C#.NET的正则表达式。

为什么正则表达式? 相信我,你不想使用正则表达式。 一位智者曾经说过:

有些人,当遇到一个问题,认为“我知道,我将使用正则表达式。” 现在他们有两个问题。

让我说出你的2个问题,现在:

  • 检索有关使用IPCONFIG TCP / IP配置信息
  • 从解析使用正则表达式这个工具的输出

其实你可以直接和因此利用WMI解决您原来的问题,从来没有想过再次使用正则表达式检索这些信息:

using (var mc = new ManagementClass("Win32_NetworkAdapterConfiguration"))
using (var instances = mc.GetInstances())
{
    foreach (ManagementObject instance in instances)
    {
        if (!(bool)instance["ipEnabled"])
        {
            continue;
        }

        Console.WriteLine("{0}, {1}, {2}", instance["Caption"], instance["ServiceName"], instance["MACAddress"]);

        string[] ipAddresses = (string[])instance["IPAddress"];
        string[] subnets = (string[])instance["IPSubnet"];
        string[] gateways = (string[])instance["DefaultIPGateway"];
        string domains = (string)instance["DNSDomain"];
        string description = (string)instance["Description"];
        bool dhcp = (bool)instance["DHCPEnabled"];
        string[] dnses = (string[])instance["DNSServerSearchOrder"];
    }
}

此外,你可以创建强类型的包装使用的WMI类Mgmtclassgen.exe工具使代码更安全,你将能够TPO摆脱魔弦。



Answer 3:

当然,你可以用得到的所有信息NetworkInterface.GetAllNetworkInterfaces()



文章来源: Parsing windows 'ipconfig /all' output