为什么在读取此CSV文件后,我的powershell自定义属性为null



给定下面的代码,如果CSV文件中的任何状态正好出现1次,则"num"属性的值将为"blank"而不是"1"。现在,如果CSV文件中至少有两个状态相同,则"num"属性值将为"2"。最后,如果CSV文件中没有给定状态的实例,则"num"属性值将为"0"。我很难调试为什么单个实例不能正确显示在"num"属性值中?

$DataSource = "foo.csv"
Class PieChartClass {
$Status
$Num
}

$Statuses = 'Installed', 'Decommissioned', 'In Stock', 'Removed'
$Results = {}.Invoke()
Foreach($Status in $Statuses){
$Computers = Get-Content $ServiceNowDataSource | ConvertFrom-Csv | Where-Object {$_.install_status -eq $Status}
$Result = [PieChartClass]::new()
$Result.Status = $Status
$Result.Num = $Computers.count
$Results.Add($Result)
}
$Results

CSV文件结构如下:

"name","asset","discovery_source","install_status"
"pc001","laptop","foo","Decommissioned"
"pc002","laptop","foo","Installed"
"pc003","tablet","foo","Installed"
"pc004","tablet","bar","Installed"
"pc005","laptop","bar","Decommissioned"
"pc006","desktop","bar","Removed"

给定CSV文件的$Results值为:

Status         Num
------         ---
Installed        3
Decommissioned   2
In Stock         0
Removed

为什么"删除"会显示[空白]?

我很感激你能深入了解这个bug。

我建议您使用另一种方法:

Class PieChartClass {
$Status
$Num
}
$Statuses = 'Installed', 'Decommissioned', 'In Stock', 'Removed'
#Import data and group by install_status, better in perf because you dont load to every loop
$Results=import-csv "c:tempfoo.csv" -Delimiter "," | group install_status | %{
$Result = [PieChartClass]::new()
$Result.Status = $_.Name
$Result.Num = $_.Group.count
$Result
}
#for add element with 0 elements
$Statuses | where {$_ -notin $Results.Status} | %{
$Result = [PieChartClass]::new()
$Result.Status = $_
$Result.Num = 0
$Results+=$Result
}
$Results

如果不需要PieChartClass和空的install_status元素,您可以快速执行:

import-csv "c:tempfoo.csv" -Delimiter "," | group install_status | %{[pscustomobject]@{Status=$_.Name;Num=$_.Group.count}}

或更好的

import-csv "c:tempfoo.csv" -Delimiter "," | group install_status | select Name, Count

最新更新