System.Object 而不是实际的path

下面的脚本不会生成有关文件的path,在我的CSV文件中。 相反,它给我的System.Object []。 请告诉我在这里做错了什么。

我的目标是清理多余的GPO。 我需要从GPO备份中searchxml文件并分析它们。 如果我在两个或多个GPO中find相同的自定义string,那么path将显示哪个文件夹包含冗余string,并且可以组合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需要输出一个string到CSV文件,由于Paths属性不是一个string,PowerShell隐式地调用ToString() ,产生stringSystem.Object[]Paths的types)。

使用Select-Object来计算一个以分号分隔的pathstring,如下所示:

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

这就是说,你想要做的事情可以很容易地在一个使用Group-Objectpipe道中实现:

 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