2014-01-28 2 views
2

많은 글을 쓰지 않는 이상한 점이 있습니다. 어쨌든, 여기갑니다.Powershell - Export-csv를 사용하여 여러 배열 객체에 대한 새 행 만들기

배열을 만들어 CSV로 내보내려고합니다. 문제는 반환 된 결과가 두 개 이상인 경우 CSV에 새로운 행을 추가하는 방법을 파악할 수 없다는 것입니다. 현재 모든 셀을 같은 셀로 집어 넣기 위해 조인을 사용하고 있지만 최적이 아닙니다. 제가 정말로하고 싶은 것은 새로운 행을 추가하고 그 아래에 여분의 결과를 같은 열에 던지기 위해서입니다. 말이 돼? 여기에 내가 지금 가지고있는 것입니다 :

# Grab all VMs, put into variable 
$vms = Get-VM 


# Use to build report 
foreach ($vm in $vms){ 
    New-Object PSObject -Property @{ 
    VMName = $vm.Name 
    UsedSpaceGB = $vm.UsedSpaceGB 
    StorageAllocatedGB = ($vm.HardDisks.capacitygb | Measure-Object -Sum).Sum 
    NumberOfCPUs = $cm.NumCpu 
    MemoryGB = $vm.MemoryGB 
    Datastores = Get-Datastore -VM $vm 
    Application = ($vm | Get-Annotation -CustomAttribute Applications -ErrorAction SilentlyContinue).Value | select 
    } | select VMName,@{label="Application";expression={$_.Application -join ","}},UsedSpaceGB,StorageAllocatedGB,NumberOfCPUs,MemoryGB,@{l="Datastores";e={$_.Datastores -join ","}} | Export-Csv -Path C:\script\VMCapacityUsedByApp.csv -NoClobber -Append -NoTypeInformation 

} 

그런데, 이것은 VMware의 PowerCLI 스냅인을 사용하고 있습니다. 어떤 도움이라도 대단히 감사합니다.

+0

여러 개의 반품을 제공하는 속성은 무엇입니까? – mjolinor

답변

3

좋아, 데이터 저장소와 응용 프로그램이 이전 코드에 따라 배열을 반환 할 유일한 필드 인 것처럼 보입니다. $ cm.NumCpu가 $ vm.NumCpu라고 가정하면 다음 코드가 원하는 것을 수행해야합니다. 더 많은 데이터 저장소 또는 응용 프로그램이 있는지 파악한 다음 해당 필드에 대한 배열을 확장하여 루프가 실행될 때까지 추가 데이터 저장소와 응용 프로그램을 나열하는 동일한 VM에 대한 새 레코드를 만듭니다. 첫 번째 레코드에서 VM의 모든 세부 정보 만 나열하도록 설정했지만 필요한 경우이를 변경하는 방법을 알 수 있습니다. 이 코드를 시도하고 그것이 당신에게 어떻게 보이는지 확인 :

# Grab all VMs, put into variable 
$vms = Get-VM 


# Use to build report 
foreach ($vm in $vms){ 
    $TempVM = New-Object PSObject -Property @{ 
     VMName = $vm.Name 
     UsedSpaceGB = $vm.UsedSpaceGB 
     StorageAllocatedGB = ($vm.HardDisks.capacitygb | Measure-Object -Sum).Sum 
     NumberOfCPUs = $cm.NumCpu 
     MemoryGB = $vm.MemoryGB 
     Datastores = Get-Datastore -VM $vm 
     Application = ($vm | Get-Annotation -CustomAttribute Applications -ErrorAction SilentlyContinue).Value 
    } 
    $Records = if($TempVM.Application.count -gt $TempVM.Datastores.Count){$TempVM.Application.Count}else{$TempVM.Datastores.Count} 
    $ExpandedVM = @() 
    $ExpandedVM += $TempVM|select Name,UsedSpaceGB,StorageAllocatedGB,NumberOfCPUs,MemoryGB,@{l="Datastores";e={$TempVM.Datastores[0]}},@{l="Application";e={$TempVM.Application[0]}} 
    for($i=1;$i -lt $Records;$i++){$ExpandedVM += $TempVM|select Name,@{l="Datastores";e={$TempVM.Datastores[$i]}},@{l="Application";e={$TempVM.Application[$i]}}} 
    $ExpandedVM | Export-Csv -Path C:\script\VMCapacityUsedByApp.csv -NoClobber -Append -NoTypeInformation 
} 

그것을 할 수있는 더 우아한 방법이있을 수 있지만, 그것은 적어도 당신을 위해 기능해야한다. 내가 테스트 할 VM 머신이나 사용하는 플러그인이 없으므로, 데이터 스토어와 애플리케이션을 제외한 모든 필드의 문자열은 모두 자체 어레이를 가지고 있습니다. 문자열의) 다음과 같은 결과로 끝났다 :

Name  UsedSpaceGB StorageAllo NumberOfCP MemoryGB Datastores Applicatio 
         catedGB  Us        n   
----  ----------- ----------- ---------- -------- ---------- ---------- 
TestVM  250   500   4   16   Store1  Word  
TestVM             Store2  Excel  
TestVM             Store3  Access  
TestVM                Outlook 
TestVM2  487   500   4   32   StoreA  WoW  
TestVM2             StoreB  SC2  
TestVM2             StoreC  D3   
TestVM2             StoreD    
TestVM2             StoreE    

내가 생각하기에 당신이 찾고 있었던 것이다.

+0

와우! 그건 잘된거야. 약간의 속성 이름이 변경된 vcenter 버전 (5.0 vs 5.1) 사이의 일부 변경으로 인해 약간 숙취가있었습니다. 내일 자세한 내용을 게시 할 예정입니다. 굉장한 아이디어. – John