2013-07-26 48 views
0

我是新來的PowerShell和仍然在學習,PowerShell的:合併有不同的數據線在一個CSV文件

我有一個CVS文件看起來像這樣: https://dl.dropboxusercontent.com/u/95418691/example.png

的MAC地址和VLAN去與上面的行,但我似乎無法找到一種方法來做到這一點,因爲不是每一行都有一個mac地址列出。我從一個奇怪的XML使這個CVS文件與此代碼:

$XML | 
    select-xml -xpath "/SolarWinds_SwitchPortMap/Interfaces/Interface | 
    /SolarWinds_SwitchPortMap/Interfaces/Interface/MACs/MAC" | 
    select -ExpandProperty Node | 
    select -Property Interface, Description, MACAddress, ip, DNS, VLAN, Speed | 
    Export-Csv -NoTypeInformation -Path "c:\Users\$env:username\Desktop\$ip.csv" 

因此修復這些代碼或寫別的東西CVS的線條相結合的兩種方式將是巨大的,並且如果不介意解釋您的解決方案,我正在努力學習:)謝謝。

編輯: 這是XML的樣子:

<SolarWinds_SwitchPortMap Layer2Device="<info>"> 
    <Interfaces> 
     <Interface ifIndex="<info>" CollectionTime="<info>" ConnectorPresent="<info>" Duplex="<info>" HardwareType="<info>" ifAdminStatus="<info>" ifAdminStatustest="<info>" Description="*** Frame 1 ***" ifDescr="<info>" MTU="<info>" Interface="<info>" ifOperStatus="<info>" ifSpeed="<info>" ifType="<info>" ifTypeName="<info>" InBitsSec="<info>" InPktsSec="<info>" LastChange="<info>" LastPacketIn="<info>" LastPacketOut="<info>" ModulePortIndex="<info>" OutBitsSec="<info>" OutPktSec="<info>" Port="<info>" TrunkPort="False"> 
      <MACs> 
       <MAC MACAddress="<info>" IPAddress="" DNS="" VLAN="1" Manufacturer="<info>" /> 
      </MACs> 
     </Interface> 
     <Interface ifIndex="<info>" CollectionTime="<info>" ConnectorPresent="<info>" Duplex="<info>" HardwareType="<info>" ifAdminStatus="<info>" ifAdminStatustest="<info>" Description="*** Frame 2 ***" ifDescr="<info>" MTU="<info>" Interface="<info>" ifOperStatus="<info>" ifSpeed="<info>" ifType="<info>" ifTypeName="<info>" InBitsSec="<info>" InPktsSec="<info>" LastChange="<info>" LastPacketIn="<info>" LastPacketOut="<info>" ModulePortIndex="<info>" OutBitsSec="<info>" OutPktSec="<info>" Port="<info>" TrunkPort="False"> 
      <MACs> 
       <MAC MACAddress="<info>" IPAddress="" DNS="" VLAN="1" Manufacturer="<info>" /> 
      </MACs> 
     </Interface> 
     <Interface ifIndex="<info>" CollectionTime="<info>" ConnectorPresent="<info>" Duplex="<info>" HardwareType="<info>" ifAdminStatus="<info>" ifAdminStatustest="<info>" Description="*** Frame 3 ***" ifDescr="<info>" MTU="<info>" Interface="<info>" ifOperStatus="<info>" ifSpeed="<info>" ifType="<info>" ifTypeName="<info>" InBitsSec="<info>" InPktsSec="<info>" LastChange="<info>" LastPacketIn="<info>" LastPacketOut="<info>" ModulePortIndex="<info>" OutBitsSec="<info>" OutPktSec="<info>" Port="<info>" TrunkPort="False" /> 
     <Interface ifIndex="<info>" CollectionTime="<info>" ConnectorPresent="<info>" Duplex="<info>" HardwareType="<info>" ifAdminStatus="<info>" ifAdminStatustest="<info>" Description="*** Frame 4 ***" ifDescr="<info>" MTU="<info>" Interface="<info>" ifOperStatus="<info>" ifSpeed="<info>" ifType="<info>" ifTypeName="<info>" InBitsSec="<info>" InPktsSec="<info>" LastChange="<info>" LastPacketIn="<info>" LastPacketOut="<info>" ModulePortIndex="<info>" OutBitsSec="<info>" OutPktSec="<info>" Port="<info>" TrunkPort="False"> 
      <MACs> 
       <MAC MACAddress="<info>" IPAddress="" DNS="" VLAN="1" Manufacturer="<info>" /> 
      </MACs> 
     </Interface> 
    </Interfaces> 
</SolarWinds_SwitchPortMap> 
+0

你應該公佈源XML的一個例子。 –

+0

我在原始問題中增加了一個例子:) – JasonBluefire

回答

1

嘗試是這樣的:

$csv = "$env:USERPROFILE\Desktop\$ip.csv" 
$expr = '/SolarWinds_SwitchPortMap/Interfaces/Interface' 

$XML | Select-Xml -XPath $expr | select -Expand Node | % { 
    New-Object -Type PSCustomObject -Property @{ 
    "Interface" = $_.Interface; 
    "Description" = $_.Description; 
    "Speed"  = $_.ifSpeed; 
    "MACAddress" = $_.MACs.MAC.MACAddress; 
    "IPAddress" = $_.MACs.Mac.ip; 
    "DNS"   = $_.MACs.MAC.DNS; 
    "VLAN"  = $_.MACs.MAC.VLAN; 
    } 
} | Export-Csv $csv -NoTypeInformation 
+0

這幾乎是完美的,謝謝你:D所以你創建一個對象的接口,描述等的屬性。並使用$ _。接口等信息。 $ _是什麼意思? (試圖學習:) :) – JasonBluefire

+0

'$ _'是一個自動變量,它指向從管道中讀取的當前對象。 –

+0

哦好吧,真棒。感謝您的幫助和答案:) – JasonBluefire

相關問題