创造一个前瞻性的匹配

时间:2013-02-21 07:50:26

标签: powershell powershell-v3.0

玩PS,我有一个简单的脚本。

ipconfig /all | where-object {$_ -match "IPv4" -or  $_ -match "Description"}

这很棒,可以做到我所期待的。我想要做的是提前阅读,只显示IPv4行之前的描述。或者反向搜索并获取ipv4和下一个描述,然后寻找下一个IPv4等。

有没有办法在不创建阵列的情况下旋转,然后旋转数组来解开有意义的部分?

我的笔记本电脑上的这个命令导致:

Description . . . . . . . . . . . : Microsoft Virtual WiFi Miniport Adapter
Description . . . . . . . . . . . : Killer Wireless-N 1103 Network Adapter
IPv4 Address. . . . . . . . . . . : 192.168.1.2(Preferred) 
Description . . . . . . . . . . . : Atheros AR8151 PCI-E Gigabit Ethernet Controller (NDIS 6.20)
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet1
IPv4 Address. . . . . . . . . . . : 192.168.122.1(Preferred) 
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8
IPv4 Address. . . . . . . . . . . : 192.168.88.1(Preferred) 
Description . . . . . . . . . . . : Microsoft ISATAP Adapter
Description . . . . . . . . . . . : Microsoft ISATAP Adapter #2
Description . . . . . . . . . . . : Microsoft ISATAP Adapter #3
Description . . . . . . . . . . . : Teredo Tunneling Pseudo-Interface
Description . . . . . . . . . . . : Microsoft ISATAP Adapter #4
Description . . . . . . . . . . . : Microsoft ISATAP Adapter #5

我想要的是:

Description . . . . . . . . . . . : Killer Wireless-N 1103 Network Adapter
IPv4 Address. . . . . . . . . . . : 192.168.1.2(Preferred) 
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet1
IPv4 Address. . . . . . . . . . . : 192.168.122.1(Preferred) 
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8
IPv4 Address. . . . . . . . . . . : 192.168.88.1(Preferred) 

3 个答案:

答案 0 :(得分:2)

如果要提取IPv4启用适配器的所有描述,可以尝试以下方法:

ipconfig /all | Select-String "IPv4" -AllMatches -SimpleMatch -Context 5 | % {
    $_.Context.Precontext -match "Description" -replace 'Description(?:[^:]+):(.*)$', '$1'
}
    Intel(R) 82579V Gigabit Network Connection

要使用您的代码,请尝试以下操作:

ipconfig /all | where-object {
    $_ -match "IPv4" -or  $_ -match "Description"
} | Select-String "IPv4" -SimpleMatch -AllMatches -Context 1 | % { 
    $_.context.precontext -replace 'Description(?:[^:]+):(.*)$', '$1'
}

编辑抱歉,我似乎早些时候误解了您的问题。我以为你只想要这个描述。这显示了IPv4活动适配器的描述和IP行

ipconfig /all | Select-String "IPv4" -AllMatches -SimpleMatch -Context 5 | % {
    $_.Context.Precontext -match "Description"
    $_.Line
}

Description . . . . . . . . . . . : Intel(R) 82579V Gigabit Network Connection
IPv4 Address. . . . . . . . . . . : xx.xx.xx.xx(Preferred) 

答案 1 :(得分:1)

替代解决方案:

[regex]$regex = '(?ms)^\s*(Description[^\r]+\r\n\s*IPv4[^\r]+)\r'
$regex.matches(((ipconfig /all) -match '^\s*Description|IPv4') -join "`r`n") |
foreach {$_.groups[1].value -replace '\. ',''}

答案 2 :(得分:1)

另一个选项,它只是跟踪输出中找到的最后一个描述:

switch -regex ( ipconfig /all ) { 'IPv4' { $d + $_ } 'Description' { $d = @($_) } }


此外,-match comparison operator可以处理数组以及单个字符串。因此,使用(ipconfig /all) -match 'IPv4|Description'相当于单独检查每一行的原始ipconfig /all | where { $_ -match 'IPv4' -or $_ -match 'Description' }