我有一个小问题与数组导出。我有一个数组,其中包含具有不同字段的对象(总共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
参数,否则会抛出不匹配的属性名错误。
还要注意,当再次导入时,每个子对象将有每个属性,但是缺少的将是空字符串。由于这个原因,正如在评论中提到的那样,将具有不同属性集的对象分开可能会更好。