2014-05-13 44 views
3

我想找到一種將數據轉換爲Powershell對象集合的優雅方式,但不幸的是,我無法找到一個簡單的方法。有人能幫助我嗎?Powershell - 將文本字段轉換爲對象

名稱:ENC1
IPv4地址:172.16.2.101
鏈接設置:強制,100兆比特,全雙工
名稱:ENC2
IPv4地址:172.16.2.103
鏈接設置:強制,100兆位全雙工
名稱:ENC3
IPv4地址:172.16.2.103
鏈接設置:強制,100 Mbps的,全雙工
名稱:ENC4
個 IPv4地址:172.16.2.104
鏈接設置:強制,100 Mbps的,全雙工

這是我想出了。

OUT = @()
$文字=獲取內容input.txt中
$數= 0
做{
$線=($文本$ |選擇-Skip $計數 - 首先3 )
$ obj =「」|選擇名稱,IP,設置
$ obj.Name = $ line [0] .split(「:」)[1]
$ obj.IP = $ line [1] .split(「:」)[1]
$ obj.Settings = $線[2] .split( 「:」)[1]
$出+ = $ OBJ
$計數= $計數+ 3
} 直到($計數-eq $ text.count)
$ out

有沒有更簡單的方法呢?

+0

這些數據可能已經從別的東西轉化 - 有什麼辦法可以訪問,並可能完全跳過解析? – alroc

+0

數據是作爲腳本輸出的一部分生成的。我不得不以這種或那種方式解析它。然而,這種情況並不相關 - 問題在於以這種方式呈現的任何數據。 – Sergei

回答

7

使用開關:

$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]} 
} 
+0

不錯的代碼:) –

+0

我沒有說明最後一行。爲什麼我們必須追加「; $ obj」才能使之有效? –

+0

@Kayasax - 將完成的對象放到管線上。沒有這一點,當$ obj被創建爲一個新對象時,它就會被銷燬,然後它會擊中下一個Name行。 – mjolinor

相關問題