1

玩弄 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) 
4

3 回答 3

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) 
于 2013-02-21T08:16:50.363 回答
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 '\. ',''}
于 2013-02-21T11:15:24.143 回答
1

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

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


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

于 2013-03-02T15:32:20.723 回答