![System.Object[] 而非實際路徑](https://rvso.com/image/658366/System.Object%5B%5D%20%E8%80%8C%E9%9D%9E%E5%AF%A6%E9%9A%9B%E8%B7%AF%E5%BE%91.png)
下面的腳本不會在我的 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