Object Powershell-将文本字段转换为对象

Object Powershell-将文本字段转换为对象,object,powershell,text,Object,Powershell,Text,我试图找到一种优雅的方式将下面的数据转换为Powershell对象集合,但不幸的是,我找不到一种简单的方法。有人能帮我吗 名称:ENC1 IPv4地址:172.16.2.101 链路设置:强制、100 Mbit、全双工 名称:ENC2 IPv4地址:172.16.2.103 链路设置:强制、100 Mbit、全双工 名称:ENC3 IPv4地址:172.16.2.103 链路设置:强制、100 Mbps、全双工 名称:ENC4 IPv4地址:172.16.2.104 链路设置:强制、100 Mb

我试图找到一种优雅的方式将下面的数据转换为Powershell对象集合,但不幸的是,我找不到一种简单的方法。有人能帮我吗

名称:ENC1
IPv4地址:172.16.2.101
链路设置:强制、100 Mbit、全双工
名称:ENC2
IPv4地址:172.16.2.103
链路设置:强制、100 Mbit、全双工
名称:ENC3
IPv4地址:172.16.2.103
链路设置:强制、100 Mbps、全双工
名称:ENC4
IPv4地址:172.16.2.104
链路设置:强制、100 Mbps、全双工

这就是我想到的

$out=@()
$text=获取内容输入.txt
$count=0
做{
$line=($text|选择-跳过$count-前3个)
$obj=”“|选择名称、IP、设置
$obj.Name=$line[0]。拆分(“:”[1]
$obj.IP=$line[1]。拆分(“:”[1]
$obj.Settings=$line[2]。拆分(“:”[1]
$out+=$obj
$count=$count+3
} 直到($count-eq$text.count)
$out

有更简单的方法吗?

使用开关:

$data = (@'
Name: ENC1
 IPv4 Address: 172.16.2.101
 Link Settings: Forced, 100 Mbit, Full Duplex
 Name: ENC2
 IPv4 Address: 172.16.2.103
 Link Settings: Forced, 100 Mbit, Full Duplex
 Name: ENC3
 IPv4 Address: 172.16.2.103
 Link Settings: Forced, 100 Mbps, Full Duplex
 Name: ENC4
 IPv4 Address: 172.16.2.104
 Link Settings: Forced, 100 Mbps, Full Duplex
'@).split("`n") |
foreach {$_.trim()}

Switch -Regex ($data) 
{
 '^Name: (.+)' {$obj = [PSCustomObject]@{Name=$Matches[1];IP=$null;Settings=$null}}
 '^IPv4 Address: (.+)' {$obj.IP = $matches[1]}
 '^Link Settings: (.+)' {$obj.Settings = $Matches[1];$obj}
}



Name                                 IP                                   Settings                            
----                                 --                                   --------                            
ENC1                                 172.16.2.101                         Forced, 100 Mbit, Full Duplex       
ENC2                                 172.16.2.103                         Forced, 100 Mbit, Full Duplex       
ENC3                                 172.16.2.103                         Forced, 100 Mbps, Full Duplex       
ENC4                                 172.16.2.104                         Forced, 100 Mbps, Full Duplex       
编辑:经过一些考虑,我想我更喜欢这种模式:

$DefValue = 'Parse error. Check input.'
Switch -Regex ($data) 
{
 '^Name: (.+)' {$obj;$obj = [PSCustomObject]@{Name=$Matches[1];IP=$DefValue;Settings=$DefValue}}
 '^IPv4 Address: (.+)' {$obj.IP = $matches[1]}
 '^Link Settings: (.+)' {$obj.Settings = $Matches[1]}
}

该数据可能是从其他数据转换而来的-您是否有任何方法可以访问该数据并可能完全跳过解析?该数据是作为脚本输出的一部分生成的。我将不得不以这样或那样的方式解析它。然而,在这种情况下,这是不相关的-问题是以这种方式呈现的任何数据。我不理解最后一行。为什么我们必须附加“$obj”使其工作?@Kayasax-这将完成的对象放到管道上。如果没有这些,当$obj被创建为新对象时,当它点击下一个名称行时,它就会被破坏。+1很酷的解决方案。今天学到了一些新东西。我会尝试在
名称:
处拆分,并以艰难的方式完成:)你的帖子给我留下了深刻的印象,从某种意义上讲,该帖子演示了一个只有两行代码的解决方案(不包括准备数据的代码)。但这是另一个优雅的解决方案!谢谢我添加了一个替代解决方案,它在检测输入数据中可能丢失的条目方面做得更好(IMHO)。