2013-02-21 79 views
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) 

回答

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

如果要提取所有說明對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) 
+0

這將顯示沒有可能有用的IP的活動適配器。 +1 – 2013-02-21 19:47:39

+0

我增加了另一個解決方案。起初我一定誤解了你的問題。不過,現在你有了一些選擇+如何用正則表達式提取描述的例子(IP是通過用「IP」替換「描述」和去除正則表達式中的美元符號來完成的):) – 2013-02-21 20:03:52

+0

這是一個很好的選擇,使用不同的方法,我可以選擇PS作爲'我的'工具箱中的相關工具。 – 2013-02-22 04:13:37

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' },它會單獨檢查每條線。

+0

+1這確實提供了我在原始帖子中要求的內容。這是另一種有助於使PS與我相關的方法。我根本沒有在PS中使用開關。 – 2013-03-04 16:38:21