![System.Object[] вместо фактического пути](https://rvso.com/image/658366/System.Object%5B%5D%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE%20%D1%84%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE%20%D0%BF%D1%83%D1%82%D0%B8.png)
Скрипт ниже не выводит путь к файлам в моем CSV-файле. Вместо этого он выдает мне System.Object[]. Пожалуйста, подскажите, что я делаю не так.
Моя цель — очистить избыточные GPO. Мне нужно выполнить поиск в xml-файлах из резервной копии GPO и проанализировать их. Если я найду одну и ту же пользовательскую строку в двух или более 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
Export-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