![실제 경로 대신 System.Object](https://rvso.com/image/658366/%EC%8B%A4%EC%A0%9C%20%EA%B2%BD%EB%A1%9C%20%EB%8C%80%EC%8B%A0%20System.Object.png)
아래 스크립트는 내 CSV 파일에서 문제의 파일에 대한 경로를 생성하지 않습니다. 대신 System.Object[]를 제공합니다. 내가 여기서 뭘 잘못하고 있는지 조언해주세요.
내 목표는 중복된 GPO를 정리하는 것입니다. GPO 백업에서 xml 파일을 검색하고 분석해야 합니다. 두 개 이상의 GPO에서 동일한 사용자 지정 문자열을 찾으면 경로에 중복 문자열이 포함된 폴더가 표시되며 GPO를 결합하거나 하나를 모두 삭제할 수 있습니다. 말이 되네요 .. 바라요?
$ht = @()
$files = Get-ChildItem -recurse -Filter *.xml
foreach ($file in $files)
{
$path = $file.FullName
$lines = Get-Content $path
foreach ($line in $lines)
{
if ($match = $ht | where { $_.line -EQ $line })
{
$match.count = $match.count + 1
$match.Paths += $path
}
else
{
$ht += new-object PSObject -Property @{
Count = 1
Paths = @(, $path)
Line = $line
}
}
}
}
$ht
$ht.GetEnumerator() | select Count, Paths, Line | Export-Csv c:\temp \NLG_GPO_Sort.csv
답변1
Import-Csv는 문자열을 CSV 파일로 출력해야 하는데 Paths
속성이 문자열이 아니기 때문에 PowerShell은 암시적으로 를 호출하여 ToString()
문자열 System.Object[]
( 유형 Paths
)을 생성합니다.
Select-Object
다음과 같이 세미콜론으로 구분된 경로 문자열을 계산하는 데 사용됩니다 .
$ht.GetEnumerator() | select Count, @{Name="Paths";e={$_.Paths -join ";"}}, Line|Export-Csv C:\temp\file.csv
즉, 수행하려는 작업은 다음을 사용하여 단일 파이프라인에서 쉽게 달성할 수 있습니다 Group-Object
.
Get-ChildItem -Recurse -Filter *.xml |Select-Object -First 10 |Select-String ".*" |Group-Object Line |Select-Object Count,@{Name="Paths";Expression={$_.Group.Filename -join ";"}},@{Name="Line",Expression={$_.Name}}
좀 더 읽기 쉽습니다.
$Lines = Get-ChildItem -Recurse -Filter *.xml |Select-Object -First 10 |Select-String ".*"
$Groups = $Lines |Group-Object Line
$Output = $Groups |Select-Object Count,@{Name="Paths";Expression={$_.Group.Filename -join ";"}},@{Name="Line",Expression={$_.Name}}
$Output | Export-Csv C:\temp\file.csv