2017-10-29 154 views
1

我有一些麻煩得到我的腳本格式正確。我嘗試使用VMware的powercli從vApp提取主機名和IP信息並將其導出爲CSV。使用導出Csv

到目前爲止,我有:

$vapp = Get-CIVApp -name name_of_vApp 
$vms = $vapp.ExtensionData.Children.vm 
$output = foreach ($vm in $vms) {$vm | select-object -Property Name;$vm.Section[2].NetworkConnection | select-object -Property IpAddress,ExternalIpAddress;} 
$output | export-csv -Path c:\temp\test.csv -NoTypeInformation 

的問題,似乎是在那裏我一個值分配給$output行。由於某些原因,它不會添加IP信息,即使它不在函數之外,或者甚至在不帶$ vm.name的函數內。它給我的機器名稱由空行分隔,等於服務器擁有的IP地址數量。

我的最終目標是擁有一個三個欄表格,服務器,內部IP地址和外部IP地址的名稱。任何幫助,將不勝感激。

在此先感謝。

回答

1

我想這個問題可能是因爲您輸出兩個對象,而不是一個在每個迭代。當您將單個對象返回到管道時,PowerShell通常效果最佳。您可以在此實例中使用帶有屬性散列表的[pscustomobject]類型。

我也覺得很有道理使用的ForEach-Object代替ForEach的,那麼你可以通過管道輸出直接到Export-CSV

$vapp = Get-CIVApp -name name_of_vApp 
$vms = $vapp.ExtensionData.Children.vm 

$vms | ForEach-Object { 
    [pscustomobject]@{ 
     Name = $_.name 
     IpAddress = ($_.Section[2].NetworkConnection.IpAddress) 
     ExternalIpAddress = ($_.Section[2].NetworkConnection.ExternalIpAddress) 
    } 
} | Export-CSV -Path c:\temp\test.csv -NoTypeInformation 

請注意,如果你現在的樣子收集ip地址我不知道而ExternalIPAddress屬性在這裏一定是有效的,並且當前沒有地方可以測試這部分。

+0

謝謝。我不知道'PSCustomObject',但它對於很多事情來說似乎是一個很好的工具。我也將'ForEach'混淆爲'ForEach-Object'的別名。很混亂! – Philosophene

+1

我能夠測試,並做到了。當VM擁有多個IP地址時,我遇到了一個關於PowerShell返回'System.Object []'的問題。我可以通過使用'-join',像這樣以解決這樣的:'Ip地址=(($ _第[2] .NetworkConnection.IpAddress)-join '')' – Philosophene

1

的問題是,第二Select後你仍與(過濾)$vm對象的工作和 $vm.secton[2],儘量$vm | Flatten-Object第一。

+0

我不知道拼合-對象。這將在未來有用,因爲我一直在努力將信息導出到PowerShell之外。謝謝! – Philosophene