需要在字符串下获取子字符串

时间:2019-04-02 19:29:02

标签: powershell powershell-v2.0 powershell-v3.0

我需要获取在特定字符串下的字符串。

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

例如,我需要在无线局域网适配器本地连接* 13下获取IPv4地址。

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 个答案:

答案 0 :(得分:1)

就像Lee所暗示的那样,您确实不想为此使用ipconfig,使用Powershell本机命令 容易得多。例如。要获取接口“ Ethernet 8”和“ Ethernet 10”的IPv4地址,您可以使用以下命令:

$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

答案 1 :(得分:0)

如果您被约束并决定将其解析为文本,则可以使用正则表达式来实现。

$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对象,然后输出到屏幕。可以在here中找到正则表达式的详细信息。

答案 2 :(得分:0)

有一种方法可以将字符串合并为一个,然后使用正则表达式将其拆分。

$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() }