2012-11-20 6 views
0

최근 스크립팅에 공통적 인 문제가 발생했으며 다른 사람들이이 문제를 어떻게 처리하는지보기 위해 야생에 던지기로 결정했습니다.다양한 속성을 가진 개체를 내보내는 방법?

tl; dr; 다양한 속성 수가있는 개체를 내보내려고합니다. 예 : 오브젝트 1은 3 개의 IP 주소를 가질 수 있지만 오브젝트 2는 7 개의 IP 주소를가집니다.

커스텀 프로퍼티를 가진 새로운 오브젝트를 생성 한 다음, 결과를 포착하는 방법으로 배열에 이러한 오브젝트를 삽입하는 방식으로 발전했습니다. 더 좋은 방법이 있다면 듣기 좋지만 이것이 롤 방식입니다. 이 방법은 객체가 목록 형식으로 표시 될 때 화면에 출력 할 때 100 % 작동합니다. Excell과 같은 출력을 캡처하고 저장할 때 사용할 수있는 여러 가지 내보내기/파일 방법을 시도했습니다. .

다음 객체를 구축하고 그것을 저장 날의 예입니다 (코드의 기능을 여기에 중요하지 않습니다 - 단지가 생성 결과) : 상기로부터

add-pssnapin Quest.ActiveRoles.ADManagement 
$Groups = get-qadgroup AmbigousGroupNameHere- 
$UserInfo = @() 

ForEach ($Group in $Groups) { 
    $CurrentGroupMembers = get-qadgroupmember $Group 
    write-host "Processing group:" $Group 
    ForEach ($GroupMember in $CurrentGroupMembers) { 
     If ($GroupMember.type -eq "User") { 
      $counter = 1 
      write-host "Processing member:" $GroupMember 
      $UserObject = get-qaduser $GroupMember | select SamAccountName,FirstName,LastName 

      $objUserInfo = New-Object System.Object 
      $objUserInfo | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $UserObject.SamAccountName 
      $objUserInfo | Add-Member -MemberType NoteProperty -Name FirstName -Value $UserObject.FirstName 
      $objUserInfo | Add-Member -MemberType NoteProperty -Name LastName -Value $UserObject.LastName 

      $GroupMembership = get-qadgroup -ContainsMember $GroupMember | where name -like "AmbigousGroupNameHere-*" 

      ForEach ($GroupName in $GroupMembership) { 
       $objUserInfo | Add-Member -MemberType NoteProperty -Name CtxGroup$counter -Value $GroupName.SamAccountName 
       $counter++ 
      } 
      $UserInfo += $objUserInfo 
     } else { 
      write-host "This is a group - we are ignoring it." 
     } 
    } 
} 

$UserInfo | Export-Csv UsersOutput.csv -NoType 

- 당신은 내가 볼 수 있습니다 각 그룹에 대해 객체 속성 이름을 1 씩 조정합니다. CtxGroup$counter을 사용하면 각 사용자가 가지고있는 정확한 수의 그룹에 대해 개체의 크기를 조정할 수 있습니다. 기본적으로 화면에 출력 할 때 이것이 잘 작동하는지 확인합니다. 개체가 나열되고 해당 사용자와 일치하는 각 그룹에 대한 새 속성을 볼 수 있습니다.

지금 문제가 있습니다. 내가 export-csv 또는 out-file 일 때 파일은 첫 번째 객체를 기반으로하는 충분한 헤더로 생성되므로 첫 번째 객체의 속성 양을 기준으로 머리글을 만듭니다. 첫 번째 사용자가 3 개의 일치하는 그룹을 가지고 있다고 가정하면 CtxGroup1, CtxGroup2, CtxGroup3이라는 제목이 생성됩니다. 큰! 다음, 사용자가 5 정합기를 갖는 경우 호

- 첫 번째 세 개의 상기 출력 부가 2에 포함 된 우리 CtxGroup4, CtxGroup5를위한 제목을 갖고 있지 않는 폐기된다.

다른 사람들이 어떻게이 문제를 해결합니까?

사이드 노트; 나는 엄청난 양의 물체 (따라서 표제)가있는 더미처럼 첫 번째 물체를 만드는 것을 고려했지만, 멋지 지 않아서 실제로 비효율적이라고 느끼게한다.

당신은 당신이 속성의 숫자로 $UserInfo 배열을 주문 원하는 것을 얻을 수 있습니다

답변

0

, 그것은 할 수 있지만, 나는 그룹의 수와 다른 propertie을 추가 귀하의 경우, 그렇게 간단하지 추가 :

... 
ForEach ($GroupName in $GroupMembership) { 
       $objUserInfo | Add-Member -MemberType NoteProperty -Name CtxGroup$counter -Value $GroupName.SamAccountName 
       $counter++ 
      } 
$objUserInfo | Add-Member -MemberType NoteProperty -Name NbCtxGroup -Value ($counter - 1) 
$UserInfo += $objUserInfo 
... 

$UserInfo | Sort-Object -Property NbCtxGroup -Descending | Export-Csv .\F.csv 

그것은 너무 좋은 아니지만 그것은 트릭을 할 것입니다 :

그리고이 propertie에 배열을 내림차순.

$objUserInfo.psobject.Properties | Measure-Object 
+0

감사 JPBlanc :

은 보라. 어제 게시 후 거의 동일한 솔루션을 보러 왔습니다. $ 카운터가 올바르게 사용되지 않았지만 처음에는이 카운터를 놓쳤습니다. 이 두 가지 방법 모두이 경우에 효과적입니다. 그러나 두 개의 동적 필드 (예 : NIC 카드 수 * 및 IP 주소 수)가있는 객체에는 적합하지 않습니다. 아마도 다른 시간에 대한 질문 일 것입니다. – SinFulNard

관련 문제