捕获多线,多组到Powershell变量

时间:2016-02-26 23:36:04

标签: regex powershell multiline

理想情况下,我想从ipconfig创建一个对象,它允许我们深入了解每个适配器的属性,如下所示:$ ip。$ lan。$ mac用于lan适配器的mac地址。< / p>

首先,我想开发一种方法来将每个适配器匹配的3个组(适配器类型,适配器名称,适配器属性)捕获到Powershell变量中(首选对象):https://regex101.com/r/wZ3sV1/1

以下是捕获以太网适配器部分的三个部分的一些想法,但它们仅捕获&#34;以太网适配器本地连接:&#34;:

$ip = ipconfig /all

$ip_lan = $ip | Select-String -pattern "(Ethernet [^a]*adapter) (Local[^:]+):\s*(([^\n]+\n)*)" -AllMatches | Foreach {$_.Matches} | ForEach-Object {$_.Value}

$regex_lan = [regex]"(Ethernet [^a]*adapter) (Local[^:]+):\n*(( +[^\n]+\n)*)"
$regex_lan.Matches($ip)
$regex_lan.Matches($ip).value

另外,有没有办法像这样捕获组提取的名称?:

   Description . . . . . . . . . . . : Realtek PCIe GBE Family Controller

成为Description = Realtek PCIe GBE系列控制器

4 个答案:

答案 0 :(得分:3)

我知道这并没有直接回答你的问题。而不是使用Regex解析ipconfig的输出。您可以使用Get-NetIPConfiguration来获取更易于处理的powershell对象。

PS> $ip = Get-NetIPConfiguration
PS> $ip

InterfaceAlias       : Ethernet
InterfaceIndex       : 12
InterfaceDescription : Intel(R) Ethernet Connection I217-LM
NetProfile.Name      : xyz.com
IPv4Address          : 10.20.102.162
IPv6DefaultGateway   :
IPv4DefaultGateway   : 10.20.102.1
DNSServer            : 10.20.100.9
                       10.20.100.11
                       10.20.100.13

PS> $ip.IPv4Address

IPAddress         : 10.20.102.162
InterfaceIndex    : 12
InterfaceAlias    : Ethernet
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 23
PrefixOrigin      : Dhcp
SuffixOrigin      : Dhcp
AddressState      : Preferred
ValidLifetime     : 05:16:53
PreferredLifetime : 05:16:53
SkipAsSource      : False
PolicyStore       : ActiveStore
PSComputerName    :

因此,您可以执行以下操作来获取您想要获取的值。

$ip.InterfaceAlias
$ip.InterfaceDescription
$ip.IPv4Address.IPAddress

要获取MAC地址,您可以使用Get-NetAdapter cmdlet。

$adapter = Get-NetAdapter
$adapter.MacAddress

您可以使用InterfaceIndex关联这两条信息。然后返回一个使每个都可访问的哈希表。以下内容创建了这些组合对象的数组。

$combined = Get-NetIPConfiguration | ForEach-Object {
    $adapter = Get-NetAdapter -InterfaceIndex $_.InterfaceIndex
    @{ IP = $_; Adapter = $adapter }
}

答案 1 :(得分:1)

另一种方法,如果你想要(1)一个对象和(2)应该在旧版本的PowerShell中工作的东西,那就是使用WMI来提取网络信息:

$adapters = Get-WmiObject -Class Win32_NetworkAdapterConfiguration

$adapters | Format-Table Description,IPAddress,MACAddress

$enabled = $adapters | Where-Object{$_.IPEnabled -eq $true}

您可以使用以下内容来浏览每个适配器获得的完整数据集:

$enabled | Format-List *

答案 2 :(得分:0)

如果你想从字符串中提取数据(使用正则表达式)并分配给变量,我认为你要找的是命名捕获组,你可以使用类似于以下内容:

(?<word1>\w+)

然后您可以按名称从$matches散列表中提取这些内容,例如:

PS> "hello world!" -match '(?<word1>\w+)'
True

PS> $matches["word1"]
hello

您可以在同一个正则表达式中拥有多个命名捕获组,但每个组都需要具有不同的名称。有了这个,您应该能够匹配您想要的各种文本,并为它们提供名称,以便以后轻松获取。

以下博客更多地讨论了这个概念:

答案 3 :(得分:0)

查看IPCONFIG / ALL的输出,看起来有3种不同类型的数据被返回 - 开头的标题部分和活动和非活动适配器的任意数量的部分,每个部分具有不同的格式和返回的数据集。

这是一组正则表达式,可用于解析每个表达式,并捕获显示的值:

$Header_Regex = 
@'
(?m)Windows IP Configuration

   Host Name . . . . . . . . . . . . : (.*)
   Primary Dns Suffix  . . . . . . . : (.*)
   Node Type . . . . . . . . . . . . : (.*)
   IP Routing Enabled. . . . . . . . : (.*)
   WINS Proxy Enabled. . . . . . . . : (.*)

'@


$Active_Adapter_Regex  =
@'
(?m)(.+? adapter .+):

   Connection-specific DNS Suffix  . : (.*)
   Description . . . . . . . . . . . : (.*)
   Physical Address. . . . . . . . . : (.*)
   DHCP Enabled. . . . . . . . . . . : (.*)
   Autoconfiguration Enabled . . . . : (.*)
   Link-local IPv6 Address . . . . . : (.*) 
   IPv4 Address. . . . . . . . . . . : (.*)
   Subnet Mask . . . . . . . . . . . : (.*)
   Lease Obtained. . . . . . . . . . : (.*)
   Lease Expires . . . . . . . . . . : (.*)
   Default Gateway . . . . . . . . . : (.*)
   DHCP Server . . . . . . . . . . . : (.*)
   DHCPv6 IAID . . . . . . . . . . . : (.*)
   DHCPv6 Client DUID. . . . . . . . : (.*)
   DNS Servers . . . . . . . . . . . : ((?:.|\n)*)
   NetBIOS over Tcpip. . . . . . . . : (.*)
'@

$Inactive_Adapter_Regex = 
@'
(?m)(.+? adapter .+):

   Media State . . . . . . . . . . . : (.*)
   Connection-specific DNS Suffix  . : (.*)
   Description . . . . . . . . . . . : (.*)
   Physical Address. . . . . . . . . : (.*)
   DHCP Enabled. . . . . . . . . . . : (.*)
   Autoconfiguration Enabled . . . . : (.*)

'@

$Cmd_Output = (ipconfig /all | out-string) 

$header = 
if ($Cmd_Output -match $Header_Regex)
  {$matches}

$Inactive_Adapters = 
[regex]::Matches($Cmd_Output,$Inactive_Adapter_Regex) 

$Active_Adapters =
[regex]::Matches($Cmd_Output,$Active_Adapter_Regex) 

稍微咀嚼一下,让我知道这是否有意义。