下面的脚本不会在我的 CSV 文件中生成相关文件的路径。相反,它给出了 System.Object[]。请告诉我我在这里做错了什么。
我的目标是清理多余的 GPO。我需要从 GPO 备份中搜索 xml 文件并对其进行分析。如果我在两个或多个 GPO 中找到相同的自定义字符串,路径将显示哪个文件夹包含冗余字符串,并且可以合并 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
答案1
Export-Csv 需要将字符串输出到 CSV 文件,而由于 属性Paths
不是字符串,因此 PowerShell 会隐式调用ToString()
,从而得到字符串System.Object[]
( 的类型Paths
)。
用于Select-Object
计算以分号分隔的路径字符串,如下所示:
$ht.GetEnumerator() | select Count, @{Name="Paths";e={$_.Paths -join ";"}}, Line|Export-Csv C:\temp\file.csv
话虽这么说,你想做的事情可以通过以下方式在一条管道中轻松实现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}}
更具可读性:
$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