Powershell CSV文件中的System.Object[]

Powershell CSV文件中的System.Object[],powershell,csv,Powershell,Csv,我已经阅读了所有我可以阅读的内容,但我不明白从PowerShell导出到CSV并获取System.Object[]时的问题所在 这只是我用来从SCCM管理的服务器中提取缺失更新的代码的一部分。交换机阵列就在那里,因为我需要将SCCM部署唯一ID转换为一个友好的名称,我使用该名称来标识修补集合 这工作正常,并显示在屏幕上。我只是为了测试交换机阵列,通过在脚本中添加$Updates来确保它正常工作。但是,当我尝试导出到CSVfile时,我会在列标题下获得System.Object[] 我知道我可以通

我已经阅读了所有我可以阅读的内容,但我不明白从PowerShell导出到CSV并获取System.Object[]时的问题所在

这只是我用来从SCCM管理的服务器中提取缺失更新的代码的一部分。交换机阵列就在那里,因为我需要将SCCM部署唯一ID转换为一个友好的名称,我使用该名称来标识修补集合

这工作正常,并显示在屏幕上。我只是为了测试交换机阵列,通过在脚本中添加$Updates来确保它正常工作。但是,当我尝试导出到CSVfile时,我会在列标题下获得System.Object[]

我知道我可以通过管道传输第一行,然后选择$TargetedUpdates数组中的对象,然后毫无问题地导出它们。但这只为我提供了服务器的SCCM部署唯一ID。我需要将其解析为在CSV文件中有意义的友好名称。如何做到这一点

$TargetedUpdates = Get-WmiObject -Query "Select * from CCM_TargetedUpdateEX1 where UpdateState = 0" -Namespace root\ccm\SoftwareUpdates\DeploymentAgent -Computer ifdpv02 


ForEach-Object {

$MissingUpdates = $TargetedUpdates.RefAssignments.TrimEnd(";")


$MonthlyPatch = switch ($MissingUpdates){

            "{0C3267EE-F343-4577-B1A3-C24FA0406DDF}" {"October 2014 Patching for Test\DEV Servers"} 
            "{D849903A-4594-4D72-9224-39DC2ABA22E}"  {"October 2014 Patching for Production Servers"}
            "{A3F0E8A2-FB2F-4045-8E22-7726007844E6}" {"October 2014 Patching for Manual Servers"} 
            "{DC3991B7-30EB-4529-AA63-537968A651D0}" {"October 2014 Patching for New Server Builds"}
            "{7C263094-4DA3-4AB8-9F79-0C169EA18D6D}" {"October 2014 Patching for Manual Test Servers"}
            "{39EDE4AD-71C9-4393-B849-498C6D677FFF}" {"October 2014 Patching for Test\SQL Servers"}
            #**********************************************************************************************
            #**********************************************************************************************
            default {"This is a System Center Endpoint Protection Update"}  
            }


$Updates = New-Object PSobject
$Updates | Add-Member NoteProperty Server ($TargetedUpdates.PScomputerName)
$Updates | Add-Member NoteProperty MonthlyPatch $MonthlyPatch
$Updates
$Updates | Export-Csv C:\temp\test.csv -NoTypeInformation 

}

Invoke-Item C:\temp\test.csv 

简言之:您没有单独处理每个更新

不幸的是,我不熟悉WMI返回的数据结构,不知道这是否可行。您需要将数据发送到foreach对象循环以进行处理,这是最主要的事情

$TargetedUpdates=Get WmiObject-Query Select*从CCM\U TARGETEDUPDATEX1中,其中UpdateState=0-命名空间根目录\CCM\SoftwareUpdates\DeploymentAgent-计算机ifdpv02 $TargetedUpdates |每个对象{ $MissingUpdates=$\u.RefAssignments.TrimEnd; $MonthlyPatch=开关$missinupdates{ {0C3267EE-F343-4577-B1A3-C24FA0406DDF}{2014年10月测试\DEV服务器补丁} {D849903A-4594-4D72-9224-39DC2ABA22E}{2014年10月生产服务器补丁} 因为太长而被截断********************************************************************************************** 默认值{这是System Center端点保护更新} } $Updates=新对象PSobject $Updates |添加成员NoteProperty服务器$TargetedUpdates.PScomputerName $Updates |添加成员NoteProperty MonthlyPatch$MonthlyPatch $Updates }|导出Csv C:\temp\test.Csv-notype信息 我们分别循环每个更新,为每个更新创建一个对象。然后将其发送到导出CSV进行输出

另一种方法

您可以使用存储所有id和友好名称的哈希表来代替循环中的开关,然后使用

$friendlies = @{
    "{0C3267EE-F343-4577-B1A3-C24FA0406DDF}" = "October 2014 Patching for Test\DEV Servers"
    "{D849903A-4594-4D72-9224-39DC2ABA22E}" = "October 2014 Patching for Production Servers"
    # Add more here obviously. 
}


$server = "ifdpv02" 
$TargetedUpdates = Get-WmiObject -Query "Select * from CCM_TargetedUpdateEX1 where UpdateState = 0" -Namespace root\ccm\SoftwareUpdates\DeploymentAgent -Computer $server
$TargetedUpdates | Select-Object @{Label="Server";Expression={$server}},
        @{Label="MonthlyPatch";Expression={$friendlies[$_.RefAssignments.TrimEnd(";")]}} |
        Export-Csv C:\temp\test.csv -NoTypeInformation 
这两种解决方案的注意事项如下:


就像我前面说的,我不知道数据结构。如果重构返回为数组,我们需要添加更多的逻辑,但这是可以做到的

我相信我通过将变量更改为$MonthlyPatchAssignment解决了这个问题。请原谅,我将在这里发布的代码与我最初发布的代码大不相同。关键似乎是抓住管道$.RefAssignments中的变量并将其放入我的Swich数组中。之前,我尝试使用相同的变量,但使其等于另一个变量,即$MissingUpdates=$.RefAssignments.TrimEnd

现在,我得到的是正确的值,而不是CSV文件中的System.Object[]

$MonthlyPatchAssignment =  switch ($_.RefAssignments.TrimEnd(";")) { 
                              
        "{0C3267EE-F343-4577-B1A3-C24FA0406DDF}" {"October 2014 Patching for Test\DEV Servers"} 
        "{D849903A-4594-4D72-9224-39DC2ABA22E}"  {"October 2014 Patching for Production Servers"}
        "{A3F0E8A2-FB2F-4045-8E22-7726007844E6}" {"October 2014 Patching for Manual Servers"} 
        "{DC3991B7-30EB-4529-AA63-537968A651D0}" {"October 2014 Patching for New Server Builds"}
        "{7C263094-4DA3-4AB8-9F79-0C169EA18D6D}" {"October 2014 Patching for Manual Test Servers"}
        "{39EDE4AD-71C9-4393-B849-498C6D677FFF}" {"October 2014 Patching for Test\SQL Servers"}

            default {"This is a System Center Endpoint Protection Update"}  

        }

      $NonCompliantDetail = New-Object PSobject
      $NonCompliantDetail | Add-Member NoteProperty Server    $($_.PScomputerName)
      $NonCompliantDetail | Add-Member NoteProperty PatchName $MonthlyPatchAssignment
      $NonCompliantDetail | Add-Member NoteProperty BullentinID $uBulletinID
      $NonCompliantDetail | Add-Member NoteProperty Description $uTitle
      $NonCompliantDetail | Export-Csv C:\Temp\sccm\"$FileNamePreface"_MissingUpdatesRAW.csv -NoTypeInformation -Append

我不明白你在说什么,对不起。当从我给出的第一行查询WMI时,重构是一个对象。它显示服务器不兼容的SCCM部署ID。我不明白为什么它能完美地将信息打印在屏幕上,但当导出到CSV时,一切都丢失了。我甚至不能发布屏幕截图或结果,让您更好地了解发生了什么。我真的在为这个网站的价值而挣扎。@Habanagold你试过我给你看的任何代码吗?我想提供帮助,但我没有您的环境。我试图格式化我的代码,但我想我需要一本关于如何使用格式化功能的手册。我试图突出显示所有代码并选择“代码”选项,但似乎什么也没做。缩进4个空格。我猜我不明白当它弹出时的格式垃圾。太忙了,对我来说没什么意义。