Powershell CSV文件中的System.Object[]
我已经阅读了所有我可以阅读的内容,但我不明白从PowerShell导出到CSV并获取System.Object[]时的问题所在 这只是我用来从SCCM管理的服务器中提取缺失更新的代码的一部分。交换机阵列就在那里,因为我需要将SCCM部署唯一ID转换为一个友好的名称,我使用该名称来标识修补集合 这工作正常,并显示在屏幕上。我只是为了测试交换机阵列,通过在脚本中添加$Updates来确保它正常工作。但是,当我尝试导出到CSVfile时,我会在列标题下获得System.Object[] 我知道我可以通过管道传输第一行,然后选择$TargetedUpdates数组中的对象,然后毫无问题地导出它们。但这只为我提供了服务器的SCCM部署唯一ID。我需要将其解析为在CSV文件中有意义的友好名称。如何做到这一点Powershell CSV文件中的System.Object[],powershell,csv,Powershell,Csv,我已经阅读了所有我可以阅读的内容,但我不明白从PowerShell导出到CSV并获取System.Object[]时的问题所在 这只是我用来从SCCM管理的服务器中提取缺失更新的代码的一部分。交换机阵列就在那里,因为我需要将SCCM部署唯一ID转换为一个友好的名称,我使用该名称来标识修补集合 这工作正常,并显示在屏幕上。我只是为了测试交换机阵列,通过在脚本中添加$Updates来确保它正常工作。但是,当我尝试导出到CSVfile时,我会在列标题下获得System.Object[] 我知道我可以通
$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个空格。我猜我不明白当它弹出时的格式垃圾。太忙了,对我来说没什么意义。