PowerShell导出CSV对象字段为空,如何转为带格式单字段?
问题解决:PowerShell导出CSV时userRules和Last10email字段为空的修复
核心问题分析
你的代码中$last10Email的处理逻辑错误:$last10EmailUTC已经通过Format-Table -AutoSize | Out-String转换成了纯文本字符串,后续用ForEach-Object遍历的是字符串的每个字符而非邮件对象,最终$last10Email变成了字符数组,导出CSV时无法识别为有效内容。而$userRules本身处理逻辑正确,但可能因$last10Email的问题被你误以为也为空。
修复方案
调整邮件时间转换和格式化的顺序:先处理对象的时间属性,再将处理后的对象转换成带格式的文本字符串。
修改后的完整代码
# 获取用户的收件箱规则,直接转成格式化字符串 $userRules = Get-InboxRule -Mailbox $username | Select-Object Name, Enabled, MoveToFolder, DeleteMessage, SoftDeleteMessage | Format-Table -AutoSize | Out-String # 获取用户最近10封邮件,先保留对象处理时间,再转成格式化字符串 $last10Email = Get-MessageTrace -SenderAddress $User -PageSize 10 | Select-Object -Property Received, SenderAddress, RecipientAddress, Subject | Sort-Object -Property Received -Descending | ForEach-Object { if ($_.Received -ne $null) { # 转换为PST时间(UTC-8) $_.Received = $_.Received.ToLocalTime().AddHours(-8) } return $_ } | Format-Table -AutoSize | Out-String # 创建并返回自定义对象 [PSCustomObject]@{ userPrincipalName = $user SamAccountName = $userdetails.SamAccountName Name = $userdetails.Name employeeId = $userdetails.employeeId Enabled = $userdetails.Enabled localbadPwdCount = $userdetails.BadLogonCount LastlocalBadPasswordAttempt = $userdetails.LastBadPasswordAttempt LastLocalLogonDate = $userdetails.LastLogonDate PasswordExpired = $userdetails.PasswordExpired PasswordLastSet = $userdetails.PasswordLastSet userRules = $userRules Last10email = $last10Email }
关键修复点
$last10Email处理顺序调整:先对邮件对象执行时间转换,再通过Format-Table | Out-String生成带格式的文本块,确保最终是单个字符串而非字符数组。- 保留
$userRules的正确逻辑:原本的处理是正确的,直接将收件箱规则对象转换成格式化字符串,导出CSV时会作为单个字段完整保留表格格式。
内容的提问来源于stack exchange,提问作者Robyn H
相关产品推荐
相关产品推荐

