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
'programing' 카테고리의 다른 글
Node.js를 Maria에 연결할 수 없습니다.DB (0) | 2023.08.18 |
---|---|
두 열의 빠른 비교 방법 (0) | 2023.08.18 |
pip 설치를 사용하지 않고 tar.gz 파일에서 Python 패키지를 설치하는 방법 (0) | 2023.08.18 |
jQuery: 동일한 이벤트에 대한 두 개 이상의 핸들러 (0) | 2023.08.18 |
'a:before'와 'a:after'에 대해 ':hover' 조건을 어떻게 쓸 수 있습니까? (0) | 2023.08.13 |