2013-02-21 3 views
1

Играя с PS, и у меня есть простой скрипт.Создание форвардного вида -match

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' 
} 

EDIT Извините, я неправильно сформулировал ваш вопрос раньше. Я думал, тебе нужно только описание. Это показывает описание и IP-линии для IPv4 активных адаптеров

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 –

+0

Я добавил еще одно решение. Сначала я должен был неправильно разобраться в вашем вопросе. Тем не менее, теперь у вас есть выбор + пример того, как извлечь описание с помощью регулярного выражения (IP выполняется путем замены «Описание» на «IP» и удаления знака доллара в регулярном выражении):) –

+0

Это хорошая альтернатива и с другим подходом у меня есть варианты, поскольку я делаю PS соответствующим инструментом в «моем» наборе инструментов. –

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. –