Назад | Перейти на главную страницу

System.Object [] вместо фактического пути

Приведенный ниже сценарий не создает пути к рассматриваемым файлам в моем CSV-файле. Вместо этого он дает мне System.Object []. Пожалуйста, сообщите, что я здесь делаю не так.

Моя цель - очистить избыточные GPO. Мне нужно найти XML-файлы из резервной копии 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

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