programing

PowerShell에서 CSV로 내보낼 때 열 순서를 지정하려면 어떻게 해야 합니까?

javamemo 2023. 8. 18. 20:39
반응형

PowerShell에서 CSV로 내보낼 때 열 순서를 지정하려면 어떻게 해야 합니까?

Active Directory에서 모든 Security Group과 해당 구성원을 내보내는 스크립트를 PowerShell에 작성하고 있습니다.이제 CSV 파일의 출력 형식을 지정하려고 합니다.

코드:

$Groups = Get-ADGroup -Properties * -Filter * -SearchBase "OU=SERVICES,DC=XXXXXX,DC=XXXXX" 

$Table = @()

$Record = @{
    "Group Name" = ""
    "Name" = ""
    "Username" = ""
}

Foreach($G In $Groups)
{
    $Arrayofmembers = Get-ADGroupMember -identity $G -recursive | select name,samaccountname
    Foreach ($Member in $Arrayofmembers) 
    {
        $Record."Group Name" = $G.Name
        $Record."Name" = $Member.name
        $Record."UserName" = $Member.samaccountname
        $objRecord = New-Object PSObject -property $Record
        $Table += $objrecord
    }
}

$Table | export-csv "C:\temp\SecurityGroups.csv" -NoTypeInformation

결과:

"Username","Name","Group Name"
"aman","Ani Manoukian","Commercial"
"adan","Aurelia Danneels","Commercial"
"kdeb","Kathleen De Backer","Commercial"
"TVGR","Thijs Van Grimbergen","Commercial"
"SVDE","Sofie Van den Eynde","Commercial"

이제 출력 형식을 다음 순서로 지정합니다.

"Group Name","Name","Username"

다음 대신:"Username","Name","Group Name"

Gvee의 유용한 답변은 열이 원하는 순서로 나타나도록 보장하는 실용적인 솔루션입니다. 왜냐하면 속성 이름을 전달하는 순서가Select-Object속성이 결과에 추가되는 순서입니다.[pscustomobject]예를 들면

그러나 결과 객체를 효과적으로 복제하는 추가 파이프라인 단계 없이 원하는 순서를 정의할 수 있으므로 비효율적입니다.

정의$Record다음과 같이 정렬해시 테이블로 사용합니다(PSv3+ 필요, 선택적 인용 생략, 단일 따옴표 사용).

$Record = [ordered] @{
    'Group Name' = ''
    Name = ''
    Username = ''
}

이것은 다음을 보장합니다.[pscustomobject]나중에 에 의해 생성된 인스턴스New-Object PSObject -property $Record호출에는 키가 정의된 순서와 동일한 속성이 포함됩니다.$Record.

두 가지 측면:

  • New-Object PSObject -property $Record로 단순화할 수 있습니다.[pscustomobject] $Record(아래 참조)
  • 대규모 어레이를 점진적으로 구축하는 것은 보다 효율적으로 처리됩니다.[System.Collections.ArrayList]요소를 추가하는 인스턴스.Add()PowerShell의 내장 어레이를 사용하는 대신+=매번 배열의 복사본을 만듭니다.더욱 좋은 것은 PowerShell이 고객의 스토리지에서 출력을 캡처하는 것만으로 스토리지를 생성할 수 있도록 하는 것입니다.foreach변수의 루프($Table = foreach ... 답변 보기)

추가 정보:

문제의 원인은 일반 해시 테이블([hashtable]인스턴스)이 효과적으로 예측할 수 없는 순서로 키를 열거한다는 것입니다(명령은 구현 세부 정보이며 보장되지 않음).[pscustomobject]해시 테이블에서 예측할 수 없는 키 순서가 결과 개체 속성 순서에 반영됩니다.

반대로 PSv3+에서는 해시 테이블 리터럴 앞에 키워드를 배치하여 순서가 지정된 해시 테이블을 만들있으며, 이 경우 추가 순서에 따라 순서가 지정된 인스턴스가 생성됩니다.
작성[pscustomobject]그런 다음 순서가 지정된 해시 테이블의 인스턴스는 결과 개체의 속성에 해당 키 순서를 보존합니다.

PowerShell v3+는 캐스트 사용하여 해시 테이블에서 인스턴스를 만들있는 편리한 바로 가기를 제공합니다. 예:

PS> [pscustomobject] @{ a = 1; b = 2; c = 3 } # key order is PRESERVED

a b c
- - -
1 2 3

키 정의 순서가 어떻게 보존되었는지 기록합니다.[ordered]지정되지 않았습니다.
즉, 다음과 같습니다.해시 테이블을 문자 그대로 캐스팅할 경우, 는 암시되므로 위의 내용은 다음과 같습니다.

[pscustomobject] [ordered] @{ a = 1; b = 2; c = 3 }  # [ordered] is optional

주의: 이 암묵적 순서는 해시 테이블 리터럴이 직접 캐스트된 경우에만 적용됩니다.[pscustomboject]따라서 키/키 순서는 다음과 같은 변형으로 보존되지 않습니다.

New-Object PSCustomObject -Property @{ a = 1; b = 2; c = 3 } # !! order NOT preserved

$ht = @{ a = 1; b = 2; c = 3 }; [pscustomobject] $ht # !! order NOT preserved

[pscustomobject] (@{ a = 1; b = 2; c = 3 }) # !! order NOT preserved, due to (...)

따라서 해시 테이블 리터럴을 직접 다음에 캐스팅하지 않을 때[pscustomobject]로정니다로 합니다.[ordered]

이게 효과가 있을 거길...

$Table |
  Select-Object "Group Name", "Name", "Username" |
  Export-Csv "C:\temp\SecurityGroups.csv" -NoTypeInformation

언급URL : https://stackoverflow.com/questions/42090900/how-can-i-specify-the-column-ordering-when-exporting-to-csv-in-powershell

반응형