Нужно получить подстроку под строкой - PullRequest
0 голосов
/ 02 апреля 2019

Мне нужно получить строку, которая находится под определенной строкой.

$string = 'Wireless LAN adapter Local Area Connection* 13' 
ipconfig | ForEach-Object{if($_ -match $string){Select-String -AllMatches 'IPv4 Address' | Out-File C:\Temp\Avi\found.txt}}

Например, мне нужно получить IPv4-адрес в адаптере беспроводной локальной сети Local Area Connection * 13.

Wireless LAN adapter Wi-Fi:

   Connection-specific DNS Suffix  . : 
   Link-local IPv6 Address . . . . . : fe80::34f2:d41c:3889:452e%21
   IPv4 Address. . . . . . . . . . . : 172.20.10.2
   Subnet Mask . . . . . . . . . . . : 255.255.255.240
   Default Gateway . . . . . . . . . : 172.20.10.1

Wireless LAN adapter Local Area Connection* 13:

   Connection-specific DNS Suffix  . : 
   Link-local IPv6 Address . . . . . : fe80::b946:1464:9876:9e03%29
   IPv4 Address. . . . . . . . . . . : 192.168.137.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Как намекает Ли, вы действительно не хотите использовать ipconfig для этого, намного проще работать с собственными командами Powershell. Например. чтобы получить IPv4-адреса для интерфейсов «Ethernet 8» и «Ethernet 10», вы можете использовать что-то вроде этого:

$NetworkInterfaces = @(
    "Ethernet 10"
    "Ethernet 8"
)
foreach ($Interface in $NetworkInterfaces) {
    Get-NetIPAddress -InterfaceAlias $Interface -AddressFamily IPv4 |
        Select-Object InterfaceAlias,IPAddress 
}

, который в моем случае возвращает это:

InterfaceAlias IPAddress
-------------- ---------
Ethernet 10    169.254.157.233
Ethernet 8     169.254.10.64
0 голосов
/ 03 апреля 2019

Существует способ объединить строки в одну, а затем разделить ее с помощью регулярного выражения.

$s = "Wireless LAN adapter Local Area Connection* 13"
$k = "IPv4 Address"

$part = (ipconfig) -join "`n" -split "(?<=\n)(?=\S)" | Where-Object { $_.StartsWith($s) }

$part.Split("`n") |
    Where-Object { $_.TrimStart().StartsWith($k) } |
    ForEach-Object { $_.Split(":", 2)[1].Trim() }
0 голосов
/ 03 апреля 2019

Если вы связаны и решите проанализировать это как текст, вы можете использовать для этого регулярное выражение.

$a = ipconfig | Select-String 'IPv4.*\s(?<ip>(?:[0-9]{1,3}\.){3}[0-9]{1,3})'
$a.matches[0].groups["ip"].value

10.11.12.13

При этом используется сопоставление регулярному выражению Select-String, чтобы найти совпадения в качестве именованных групп, сохранить их как объект matchinfo, а затем вывести на экран. Подробности регулярного выражения можно найти здесь .

...