导出不同列的PS对象数组到csv



我有一个小问题与数组导出。我有一个数组,其中包含具有不同字段的对象(总共12个字段),我不能使用export -CSV和Out-File将所有字段导出为CSV。

对于示例的目的:

$logs = @()
$logs | export-csv -path c:test.csv --NoTypeInformation

这是数组($ Logs)的内容:

$logs[0]
LogTime             : 2017-03-20 07:10:32.917
LogName             : Network connection detected (rule: NetworkConnect)
DeviceName          : K***M.w****l.local
ProcessGuid         : {297FCCB8-2783-58C8-0000-0010EB030000}
ProcessId           : 4
User                : NT AUTHORITYSYSTEM
DestinationHostname : W***C
DestinationIp       : 10.**.***.6
DestinationIsIpv6   : false
DestinationPort     : 445
DestinationPortName : microsoft-ds
Image               : System
Initiated           : true
Protocol            : tcp
SourceHostname      : K**M.w***l.local
SourceIp            : 10.**.***.11
SourceIsIpv6        : false
SourcePort          : 53786
$logs[1]
LogTime           : 2017-03-20 11:14:05.553
LogName           : Process Create (rule: ProcessCreate)
DeviceName        : K***M.w***l.local
LogonId           : 0x1a84303
ParentCommandLine : C:WindowsExplorer.EXE
ParentImage       : C:Windowsexplorer.exe
ParentProcessGuid : {297FCCB8-4358-58C9-0000-00103AB04800}
ParentProcessId   : 2884
ProcessGuid       : {297FCCB8-B97D-58CF-0000-00100D4EA801}
ProcessId         : 2440
TerminalSessionId : 2
User              : W***Ladministrator
Image             : \10.10.**0.6shareInstallsAVG_Protection_Free_1606.exe
CommandLine       : "\10.10.**0.6shareInstallsAVG_Protection_Free_1606.exe" 
CurrentDirectory  : \10.10.**0.6shareInstalls
Hashes            : SHA1=E1CC52656F0AB86757E551C4181E4E11D6B2C811,MD5=8E1B5B613267120F1A6979021B0A1ED7,SHA256=6FE9ADD42C149CC4697124293A764B2CFD908F4A3CE6E88BAB35D5CF85620EC6,IMPHASH=D8843771C5D1046A951FECEB11DD00A8
IntegrityLevel    : High
LogonGuid         : {297FCCB8-B971-58CF-0000-00200343A801}

如何将其导出为CSV以便不遗漏列?

谢谢!

Export-Csv根据传递的第一个对象的属性名确定列,如文档中所述。为了避免这种情况,您可以使用-Append -Force现有的写入数据。CSV文件,其中已指定了所有列标题。您可以手动添加这些,或者从$logs中的所有对象中提取每个唯一属性名称,您可以使用以下内容:

$OutColumns = $logs | ForEach-Object {$_.PSObject.Properties.Name} | Select-Object -Unique
$OutColumns -replace '"','""' -join '","' -replace '^|$','"' | Out-File C:test.csv

如果您正在处理大量数据,下面的操作可能会稍微快一点:

$OutColumns = [System.Collections.Generic.List[string]]::new()
foreach ($obj in $logs) {
foreach ($propName in $obj.PSObject.Properties.Name) {
if ($OutColumns -notcontains $propName) {
$OutColumns.Add($propName)
}
}
}
$OutColumns -replace '"','""' -join '","' -replace '^|$','"' | Out-File C:test.csv

然后您可以将$logs条目添加到该文件中:

$logs | Export-Csv -Path C:test.csv -NoTypeInformation -Append -Force

这里的-Append必须使用-Force参数,否则会抛出不匹配的属性名错误。

还要注意,当再次导入时,每个子对象将有每个属性,但是缺少的将是空字符串。由于这个原因,正如在评论中提到的那样,将具有不同属性集的对象分开可能会更好。

相关内容

  • 没有找到相关文章

最新更新