理想情况下,我想从ipconfig创建一个对象,它允许我们深入了解每个适配器的属性,如下所示:$ ip。$ lan。$ mac用于lan适配器的mac地址。< / p>
首先,我想开发一种方法来将每个适配器匹配的3个组(适配器类型,适配器名称,适配器属性)捕获到Powershell变量中(首选对象):https://regex101.com/r/wZ3sV1/1
以下是捕获以太网适配器部分的三个部分的一些想法,但它们仅捕获&#34;以太网适配器本地连接:&#34;:
$ip = ipconfig /all
$ip_lan = $ip | Select-String -pattern "(Ethernet [^a]*adapter) (Local[^:]+):\s*(([^\n]+\n)*)" -AllMatches | Foreach {$_.Matches} | ForEach-Object {$_.Value}
$regex_lan = [regex]"(Ethernet [^a]*adapter) (Local[^:]+):\n*(( +[^\n]+\n)*)"
$regex_lan.Matches($ip)
$regex_lan.Matches($ip).value
另外,有没有办法像这样捕获组提取的名称?:
Description . . . . . . . . . . . : Realtek PCIe GBE Family Controller
成为Description = Realtek PCIe GBE系列控制器
答案 0 :(得分:3)
我知道这并没有直接回答你的问题。而不是使用Regex解析ipconfig
的输出。您可以使用Get-NetIPConfiguration
来获取更易于处理的powershell对象。
PS> $ip = Get-NetIPConfiguration
PS> $ip
InterfaceAlias : Ethernet
InterfaceIndex : 12
InterfaceDescription : Intel(R) Ethernet Connection I217-LM
NetProfile.Name : xyz.com
IPv4Address : 10.20.102.162
IPv6DefaultGateway :
IPv4DefaultGateway : 10.20.102.1
DNSServer : 10.20.100.9
10.20.100.11
10.20.100.13
PS> $ip.IPv4Address
IPAddress : 10.20.102.162
InterfaceIndex : 12
InterfaceAlias : Ethernet
AddressFamily : IPv4
Type : Unicast
PrefixLength : 23
PrefixOrigin : Dhcp
SuffixOrigin : Dhcp
AddressState : Preferred
ValidLifetime : 05:16:53
PreferredLifetime : 05:16:53
SkipAsSource : False
PolicyStore : ActiveStore
PSComputerName :
因此,您可以执行以下操作来获取您想要获取的值。
$ip.InterfaceAlias
$ip.InterfaceDescription
$ip.IPv4Address.IPAddress
要获取MAC地址,您可以使用Get-NetAdapter
cmdlet。
$adapter = Get-NetAdapter
$adapter.MacAddress
您可以使用InterfaceIndex关联这两条信息。然后返回一个使每个都可访问的哈希表。以下内容创建了这些组合对象的数组。
$combined = Get-NetIPConfiguration | ForEach-Object {
$adapter = Get-NetAdapter -InterfaceIndex $_.InterfaceIndex
@{ IP = $_; Adapter = $adapter }
}
答案 1 :(得分:1)
另一种方法,如果你想要(1)一个对象和(2)应该在旧版本的PowerShell中工作的东西,那就是使用WMI来提取网络信息:
$adapters = Get-WmiObject -Class Win32_NetworkAdapterConfiguration
$adapters | Format-Table Description,IPAddress,MACAddress
$enabled = $adapters | Where-Object{$_.IPEnabled -eq $true}
您可以使用以下内容来浏览每个适配器获得的完整数据集:
$enabled | Format-List *
答案 2 :(得分:0)
如果你想从字符串中提取数据(使用正则表达式)并分配给变量,我认为你要找的是命名捕获组,你可以使用类似于以下内容:
(?<word1>\w+)
然后您可以按名称从$matches
散列表中提取这些内容,例如:
PS> "hello world!" -match '(?<word1>\w+)'
True
PS> $matches["word1"]
hello
您可以在同一个正则表达式中拥有多个命名捕获组,但每个组都需要具有不同的名称。有了这个,您应该能够匹配您想要的各种文本,并为它们提供名称,以便以后轻松获取。
以下博客更多地讨论了这个概念:
答案 3 :(得分:0)
查看IPCONFIG / ALL的输出,看起来有3种不同类型的数据被返回 - 开头的标题部分和活动和非活动适配器的任意数量的部分,每个部分具有不同的格式和返回的数据集。
这是一组正则表达式,可用于解析每个表达式,并捕获显示的值:
$Header_Regex =
@'
(?m)Windows IP Configuration
Host Name . . . . . . . . . . . . : (.*)
Primary Dns Suffix . . . . . . . : (.*)
Node Type . . . . . . . . . . . . : (.*)
IP Routing Enabled. . . . . . . . : (.*)
WINS Proxy Enabled. . . . . . . . : (.*)
'@
$Active_Adapter_Regex =
@'
(?m)(.+? adapter .+):
Connection-specific DNS Suffix . : (.*)
Description . . . . . . . . . . . : (.*)
Physical Address. . . . . . . . . : (.*)
DHCP Enabled. . . . . . . . . . . : (.*)
Autoconfiguration Enabled . . . . : (.*)
Link-local IPv6 Address . . . . . : (.*)
IPv4 Address. . . . . . . . . . . : (.*)
Subnet Mask . . . . . . . . . . . : (.*)
Lease Obtained. . . . . . . . . . : (.*)
Lease Expires . . . . . . . . . . : (.*)
Default Gateway . . . . . . . . . : (.*)
DHCP Server . . . . . . . . . . . : (.*)
DHCPv6 IAID . . . . . . . . . . . : (.*)
DHCPv6 Client DUID. . . . . . . . : (.*)
DNS Servers . . . . . . . . . . . : ((?:.|\n)*)
NetBIOS over Tcpip. . . . . . . . : (.*)
'@
$Inactive_Adapter_Regex =
@'
(?m)(.+? adapter .+):
Media State . . . . . . . . . . . : (.*)
Connection-specific DNS Suffix . : (.*)
Description . . . . . . . . . . . : (.*)
Physical Address. . . . . . . . . : (.*)
DHCP Enabled. . . . . . . . . . . : (.*)
Autoconfiguration Enabled . . . . : (.*)
'@
$Cmd_Output = (ipconfig /all | out-string)
$header =
if ($Cmd_Output -match $Header_Regex)
{$matches}
$Inactive_Adapters =
[regex]::Matches($Cmd_Output,$Inactive_Adapter_Regex)
$Active_Adapters =
[regex]::Matches($Cmd_Output,$Active_Adapter_Regex)
稍微咀嚼一下,让我知道这是否有意义。