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 Paths
Eigenschaft 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