2017-03-07 10 views
1

대부분의 속성이 다른 개체 목록을 반환하는 스크립트를 작성하고 있습니다. 콘솔에서 인쇄 할 때 모든 내용이 정상이지만 CSV로 내보낼 때 모든 개체에서 공통적으로 나타나는 필드 만 내보내집니다. 다른 모든 것들은 잘립니다.혼합 유형 개체를 CSV 파일로 내보내는 방법은 무엇입니까?

Add-Member cmdlet을 사용하여 더 많은 속성을 추가하지만 모든 개체가 동일한 속성 수를 얻지는 않습니다.

FirstObject:{ 
    Network0:nic1, 
    Network1:nic2, 
    Network2:nic3, 
    Network3:nic4, 
    Name:VirtualMachine1 
} 

SecondObject:{ 
    Network0:nic1, 
    Network1:nic2, 
    Name:VirtualMachine1 
} 

네트워크 속성 Add-Member cmdlet에서 추가됩니다

예를 들어 나는 일이 같다 2 개체를 내보내려고. CSV로 내보낼 때 문제는 첫 번째 개체의 Network2Network3 속성이 잘리고 모든 열이 Network0, Network1Name 인 것입니다.

내가 알고 싶은 것은 모든 속성을 내보내는 방법이며 객체 중 하나에 속성이없는 경우 $null을 할당 하시겠습니까?

P. 루프를 사용하여 해당 필드를 수동으로 추가 할 수있는 솔루션이 있지만 PowerShell에 내장 된 더 깨끗한 솔루션이 무엇인지 궁금합니다.

업데이트 : 나는 그것이 첫 번째 개체에있는 파일에 동일한 열을 제공한다는 것을 발견

. 다른 모든 필드는 무시됩니다. 더 정확히 말하면 모든 객체의 모든 열이 필요합니다. 필드가없는 개체가 있으면 빈 페이지로 인쇄해야합니다.

+0

현재 내보내는 데 사용중인 코드를 확인하는 것이 도움이됩니다. –

+0

나는이 모든 객체를 파이프 라이닝하고 있습니다 -> | export-csv -notypeinformation exported.csv – SokIsKedu

답변

2

누락 된 속성을 추가하는 몇 줄의 코드.

#sample setup 
$one = [pscustomobject]@{ 
    Network0='nic1' 
    Network1='nic2' 
    Network2='nic3' 
    Network3='nic4' 
    Name='VirtualMachine1' 
} 


$two = [pscustomobject]@{ 
    Network0='nic1' 
    Network1='nic2' 
    Name='VirtualMachine2' 
} 

$three = [pscustomobject]@{ 
    Network0='nic1' 
    Name='VirtualMachine3' 
} 

$export = ($one,$two,$three) 

#build list of all properties available to $allProps 
$export | % -begin { $allProps = @() } -process { $allProps = [linq.enumerable]::union([object[]](($_.psobject.Properties).Name), [object[]]$allProps) } 

#convert each object in $export to new custom object having all properties and put to $result 
$export | % -begin { $result = @() } -process { $__ = $_; $o = @{ }; $allProps | %{ $o += @{ $_ = $__.$_ } }; $result+=[pscustomobject]$o } 

#export $result to csv 
$result | Export-Csv $env:TEMP\export.csv -NoTypeInformation -Force 

Get-Content $env:TEMP\export.csv 

"Network1", "Network3", "Network0", "Name", "Network2" 
"nic2", "nic4", "nic1", "VirtualMachine1", "nic3" 
"nic2",, "nic1", "VirtualMachine2", 
,, "nic1", "VirtualMachine3", 
>> Script Ended 

유의할 것들 :

  • [linq.enumerable]::union 모든 객체에서 사용할 수있는 모든 속성을 쉽게 빌드 목록에 사용됩니다.
  • ($_.psobject.Properties).Name@($_.psobject.Properties | select -ExpandProperty Name)을 단축하고, 그 속성 이름의 배열을 포함
  • $__ = $_nested loop
  • $o += @{ $_ = $__.$_ } 트릭 출력 객체에 키 - 값 쌍을 추가이고; 트릭은 여기서 $_='nic4'$__ 내보내기 개체에 존재하지 않더라도 powershell은 오류를 throw하지 않고 $ null을 반환한다는 것입니다. Set-StrictMode-Version 2 이상으로 설정된 경우에는 작동하지 않습니다.
+0

대단히 감사합니다! 아마 내가 본 가장 어려운 라이너 중 하나 일거야. 그 것들을 주셔서 감사합니다, 정말 도움이 :) – SokIsKedu