Powershell System.Object[]而不是数组中的实际路径

Powershell System.Object[]而不是数组中的实际路径,powershell,csv,Powershell,Csv,下面的脚本不会在我的CSV文件中生成相关文件的路径。相反,它给了我System.Object[]。请告诉我我在这里做错了什么 我的目标是清理多余的GPO。我需要从GPO备份中搜索xml文件并对其进行分析。如果我在两个或多个GPO中发现相同的自定义字符串,路径将显示哪个文件夹包含冗余字符串,并且可以合并GPO或将其中一个一起删除。有道理。。我希望? 下面是我得到的结果:第一行是计数,第三行是该行的值,第二行是System.Object,它应该像 c:\gpobackup\00A72CC5-7935

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

我的目标是清理多余的GPO。我需要从GPO备份中搜索xml文件并对其进行分析。如果我在两个或多个GPO中发现相同的自定义字符串,路径将显示哪个文件夹包含冗余字符串,并且可以合并GPO或将其中一个一起删除。有道理。。我希望?
下面是我得到的结果:第一行是计数,第三行是该行的值,第二行是System.Object,它应该像

c:\gpobackup\00A72CC5-7935-4F97-A40B-68DE0ED927BF

1系统对象[]标识符xmlns=”http://www.microsoft.com/GroupPolicy/Types“>{548FF13C-4CDD-43C7-8C59-D19087424B16}
5系统对象[]域xmlns=”http://www.microsoft.com/GroupPolicy/Types“>corp.domain.net
5系统对象[]
1系统对象[]名称>Exchange移动-SNY SPA-启用PST存档
5系统对象[]IncludeComments>true


导出Csv
不会神奇地用数组值展开属性。你需要自己去做:

$ht.GetEnumerator()|
选择Count,@{n='Paths';e={$\u0.Paths-join'|'},第行|
导出Csv c:\temp\NLG\u GPO\u Sort.Csv

导出Csv
不会神奇地使用数组值展开属性。你需要自己去做:

$ht.GetEnumerator()|
选择Count,@{n='Paths';e={$\u0.Paths-join'|'},第行|
导出Csv c:\temp\NLG\u GPO\u Sort.Csv

导出Csv
不会神奇地使用数组值展开属性。你需要自己去做:

$ht.GetEnumerator()|
选择Count,@{n='Paths';e={$\u0.Paths-join'|'},第行|
导出Csv c:\temp\NLG\u GPO\u Sort.Csv

导出Csv
不会神奇地使用数组值展开属性。你需要自己去做:

$ht.GetEnumerator()|
选择Count,@{n='Paths';e={$\u0.Paths-join'|'},第行|
导出Csv c:\temp\NLG\u GPO\u Sort.Csv


您的脚本没有真正利用PowerShell的管道行为。剧本的最终目标是什么?我们也许可以重新设计它,使其更有效地工作。@Bill我的目标是清理多余的GPO。我需要从GPO备份中搜索xml文件并对其进行分析。如果我在两个或多个GPO中发现相同的自定义字符串,路径将显示哪个文件夹包含冗余字符串,并且可以合并GPO或将其中一个一起删除。有道理。。我希望?如果您可以发布示例文件内容以及您期望的输出,这将有所帮助。@Bill_Stewart我添加了示例您的脚本没有真正利用PowerShell的管道行为。剧本的最终目标是什么?我们也许可以重新设计它,使其更有效地工作。@Bill我的目标是清理多余的GPO。我需要从GPO备份中搜索xml文件并对其进行分析。如果我在两个或多个GPO中发现相同的自定义字符串,路径将显示哪个文件夹包含冗余字符串,并且可以合并GPO或将其中一个一起删除。有道理。。我希望?如果您可以发布示例文件内容以及您期望的输出,这将有所帮助。@Bill_Stewart我添加了示例您的脚本没有真正利用PowerShell的管道行为。剧本的最终目标是什么?我们也许可以重新设计它,使其更有效地工作。@Bill我的目标是清理多余的GPO。我需要从GPO备份中搜索xml文件并对其进行分析。如果我在两个或多个GPO中发现相同的自定义字符串,路径将显示哪个文件夹包含冗余字符串,并且可以合并GPO或将其中一个一起删除。有道理。。我希望?如果您可以发布示例文件内容以及您期望的输出,这将有所帮助。@Bill_Stewart我添加了示例您的脚本没有真正利用PowerShell的管道行为。剧本的最终目标是什么?我们也许可以重新设计它,使其更有效地工作。@Bill我的目标是清理多余的GPO。我需要从GPO备份中搜索xml文件并对其进行分析。如果我在两个或多个GPO中发现相同的自定义字符串,路径将显示哪个文件夹包含冗余字符串,并且可以合并GPO或将其中一个一起删除。有道理。。我希望?如果您能发布示例文件内容以及您期望的输出,这将有所帮助。@Bill_Stewart我添加了examplesWorks perfectly Ansgar。谢谢。@Ken这很可能是因为计算每个文件内容的代码为每个匹配行添加了路径。无论如何,您不应该这样处理XML文件。确定构成匹配GPO的条件(值、属性),并使用XML解析器检查这些条件。然而,这将是一个不同的问题,所以你应该把它作为一个新的。一个快速而肮脏的解决方法(我不推荐)是选择唯一的路径:
@{n='paths';e={($\u.paths | select-unique)-join'.'}
。感谢您的反馈。我将发布一个不同的问题。非常适合Ansgar。谢谢。@Ken这很可能是因为计算每个文件内容的代码为每个匹配行添加了路径。无论如何,您不应该这样处理XML文件。确定构成匹配GPO的条件(值、属性),并使用XML解析器检查这些条件。然而,这将是一个不同的问题,所以你应该把它作为一个新的。一个快速而肮脏的解决方法(我不推荐)是选择唯一的路径:
@{n='paths';e={($\u.paths | select-unique)-join'.'}
。感谢您的反馈。我将发布一个不同的问题。非常适合Ansgar。谢谢。@Ken这很可能是因为计算每个文件内容的代码添加了p
$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