下面的脚本不会生成有关文件的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-Object
pipe道中实现:
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