PowerShell处理邮件转换CSV时列值显示System.Object[]问题
解决PowerShell处理CSV时列显示System.Object[]的问题
问题出在你用Where-Object提取设备数量的逻辑上:Where-Object返回的是数组对象,哪怕只匹配到一个结果,它依然是长度为1的数组。当把数组赋值给自定义对象的属性后,Export-Csv会将数组的类型名System.Object[]输出,而非你需要的具体数值。
修正方案(两种可选)
方案1:直接取数组的第一个元素
在每个设备数量变量后面加[0],确保拿到单个数值:
$functionalDevices = (($components | Where-Object {$_ -match "Functional Devices=\d+" }) -replace "Functional Devices=", "")[0] $NotfunctionalDevices = (($components | Where-Object {$_ -match "Not Functional Devices=\d+" }) -replace "Not Functional Devices=", "")[0] $TotalDevices = (($components | Where-Object {$_ -match "Total Devices=\d+" }) -replace "Total Devices=", "")[0]
方案2:用正则直接提取(更高效简洁)
不需要拆分后再过滤,直接对单行文本用正则匹配提取数值:
$functionalDevices = if ($data[$i+1] -match "Functional Devices=(\d+)") { $matches[1] } $NotfunctionalDevices = if ($data[$i+1] -match "Not Functional Devices=(\d+)") { $matches[1] } $TotalDevices = if ($data[$i+1] -match "Total Devices=(\d+)") { $matches[1] }
额外优化:简化Site字段的替换逻辑
你原来写了9个重复的-replace,可以用正则一次性匹配所有Midtier服务器:
$siteSelection = $data[$i] -replace 'Midtier: lcahncr\d+\.lcahncrkc\.net Site selection: ', ''
完整修正后的代码
$inputcsv = 'C:\Users\Testing\04052024\4032024 DTV Report input.csv' $outputcsv = 'C:\Users\Testing\04052024\4052024 724 Report Output1122.csv' $data = Get-Content $inputcsv $parsedData = @() for ($i = 0; $i -lt $data.Count; $i += 2) { # 简化Site字段的正则替换 $siteSelection = $data[$i] -replace 'Midtier: lcahncr\d+\.lcahncrkc\.net Site selection: ', '' # 用正则直接提取各设备数量 $functionalDevices = if ($data[$i+1] -match "Functional Devices=(\d+)") { $matches[1] } $NotfunctionalDevices = if ($data[$i+1] -match "Not Functional Devices=(\d+)") { $matches[1] } $TotalDevices = if ($data[$i+1] -match "Total Devices=(\d+)") { $matches[1] } $parsedObject = [PSCustomObject]@{ Site= $siteSelection "Functional Devices" = $functionalDevices "Not Functional Devices" = $NotfunctionalDevices "Total Devices" = $TotalDevices } $parsedData += $parsedObject } $parsedData | Export-Csv -Path $outputcsv -NoTypeInformation
这样处理后,输出的CSV里就会显示实际的数值,而不是System.Object[]了。
内容的提问来源于stack exchange,提问作者Slyons
相关产品推荐
相关产品推荐

