![System.Object[] en lugar de la ruta real](https://rvso.com/image/658366/System.Object%5B%5D%20en%20lugar%20de%20la%20ruta%20real.png)
La siguiente secuencia de comandos no genera la ruta a los archivos en cuestión, en mi archivo CSV. En cambio, me está dando System.Object[]. Por favor, indique qué estoy haciendo mal aquí.
Mi objetivo es limpiar los GPO redundantes. Necesito buscar los archivos xml desde una copia de seguridad de GPO y analizarlos. Si encuentro la misma cadena personalizada en dos o más GPO, la ruta me mostrará qué carpeta contiene la cadena redundante y puedo combinar los GPO o eliminar uno por completo. Tiene sentido... ¿espero?
$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
Respuesta1
Export-Csv necesita generar una cadena en el archivo CSV y, dado que la Paths
propiedad no es una cadena, PowerShell llama implícitamente a ToString()
, lo que da como resultado la cadena System.Object[]
(el tipo de Paths
).
Úselo Select-Object
para calcular una cadena de rutas separadas por punto y coma, así:
$ht.GetEnumerator() | select Count, @{Name="Paths";e={$_.Paths -join ";"}}, Line|Export-Csv C:\temp\file.csv
Dicho esto, lo que estás intentando hacer se puede lograr fácilmente en una sola canalización usando 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}}
Un poco más legible:
$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