玩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)
答案 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' }
。