System.Object[] anstelle des tatsächlichen Pfades

System.Object[] anstelle des tatsächlichen Pfades

Das folgende Skript erzeugt in meiner CSV-Datei nicht den Pfad zu den betreffenden Dateien. Stattdessen gibt es mir System.Object[]. Bitte geben Sie mir einen Hinweis, was ich hier falsch mache.

Mein Ziel ist es, redundante GPOs zu bereinigen. Ich muss die XML-Dateien aus einem GPO-Backup suchen und analysieren. Wenn ich dieselbe benutzerdefinierte Zeichenfolge in zwei oder mehr GPOs finde, zeigt mir der Pfad an, welcher Ordner die redundante Zeichenfolge enthält, und ich kann die GPOs entweder kombinieren oder alle zusammen löschen. Das ergibt Sinn ... hoffe ich?

$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

Antwort1

Export-Csv muss eine Zeichenfolge in die CSV-Datei ausgeben, und da die PathsEigenschaft keine Zeichenfolge ist, ruft PowerShell implizit auf ToString(), was zu der Zeichenfolge System.Object[](dem Typ von Paths) führt.

Verwenden Sie es Select-Object, um eine durch Semikolon getrennte Zeichenfolge der Pfade zu berechnen, etwa so:

$ht.GetEnumerator() | select Count, @{Name="Paths";e={$_.Paths -join ";"}}, Line|Export-Csv C:\temp\file.csv

Allerdings lässt sich Ihr Vorhaben problemlos in einer einzigen Pipeline erreichen, indem Sie Folgendes verwenden 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}}

Etwas lesbarer:

$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

verwandte Informationen