PowerShell中转换结果数组内两个属性的字节值为字符串的问题
问题解决:将空格分隔的字节数字符串转换为可读字符串
错误原因
- 参数类型不匹配:
[System.Text.Encoding]::UTF8.GetString()必须接收Byte[](字节数组)作为参数,但你直接传入了空格分隔的数字字符串,PowerShell无法自动完成这种转换,因此抛出格式错误。 - 判断逻辑错误:
$result.TaskStdOutput -gt 1是对字符串执行数值比较,逻辑完全错误——空字符串或短字符串都会被误判,应该判断内容是否为有效非空值。
修正后的代码
foreach ($result in $csvresults) { # 处理标准输出字段 if (-not [string]::IsNullOrWhiteSpace($result.TaskStdOutput)) { # 拆分字符串并转换为字节数组 $byteArray = $result.TaskStdOutput -split ' ' | ForEach-Object { [byte]$_ } $result.TaskStdOutput = [System.Text.Encoding]::UTF8.GetString($byteArray) } # 处理错误输出字段 if (-not [string]::IsNullOrWhiteSpace($result.TaskErrOutput)) { $byteArray = $result.TaskErrOutput -split ' ' | ForEach-Object { [byte]$_ } $result.TaskErrOutput = [System.Text.Encoding]::UTF8.GetString($byteArray) } }
关键修改说明
- 字符串转字节数组:用
-split ' '把空格分隔的数字字符串拆分成单个数字文本,再通过[byte]$_强制转换为字节类型,最终组成符合要求的Byte[]。 - 有效内容判断:用
[string]::IsNullOrWhiteSpace()替代错误的数值比较,准确识别空值或空白内容,避免无效转换。 - 独立处理字段:去掉了嵌套的else逻辑,确保两个字段都能被正确处理,不会因为其中一个字段有值就跳过另一个。
更高效的方案:导出CSV前直接处理
如果你不需要保留原始的字节数字符串,可以在导出CSV之前就完成转换,省去导入导出的步骤:
$jobandtasklist | Select-Object Group, Name, Active, Taskname, ExitCodeResult, DatelastExecution, Description, @{ Name = 'TaskStdOutput' Expression = { if (-not [string]::IsNullOrWhiteSpace($_.TaskStdOutput)) { [System.Text.Encoding]::UTF8.GetString($_.TaskStdOutput) } else { $_.TaskStdOutput } } }, @{ Name = 'TaskErrOutput' Expression = { if (-not [string]::IsNullOrWhiteSpace($_.TaskErrOutput)) { [System.Text.Encoding]::UTF8.GetString($_.TaskErrOutput) } else { $_.TaskErrOutput } } } | Export-Csv c:\temp\ErrorReport.csv -NoTypeInformation
内容的提问来源于stack exchange,提问作者Rami Aboulissane
相关产品推荐
相关产品推荐

