PowerShell统计PSObject属性值出现次数并添加成员的问题
解决PSObject添加休假统计属性的问题
你的问题出在用Select-String处理PSObject的方式不对——Select-String是针对字符串/文本行做匹配的,当你把整个PSObject传给它时,它会先把对象转换成单个字符串(比如示例里的@{EmployeeID=MACL22656; ...}),即便这个字符串里有多个"YES",Select-String只会返回1个匹配结果(因为是一行文本),所以统计出来的数量是1,这和你想要的统计每个属性值里的"YES"总数不符。
正确的解决方案
我们需要遍历PSObject的所有属性值,统计其中等于"YES"的数量,具体代码如下:
# 遍历每个员工对象 foreach ($emp in $employee) { # 统计所有属性值为"YES"的数量 $leaveCount = ($emp.PSObject.Properties.Value | Where-Object { $_ -eq 'YES' }).Count # 添加NoteProperty $emp | Add-Member -NotePropertyName "EmployeeTotal_LeaveCount" -NotePropertyValue $leaveCount }
代码解释
$emp.PSObject.Properties.Value:获取当前员工对象的所有属性值(比如EmployeeID的值、EmployeeLeave_Monday的值等)Where-Object { $_ -eq 'YES' }:筛选出值等于"YES"的项.Count:统计筛选后的项的数量,这就是我们需要的休假天数统计
测试示例
用你给出的示例对象测试:
$sampleEmp = [PSCustomObject]@{ EmployeeID= 'MACL22656' EmployeeRole= 'Accountant' EmployeeDepartment= 'Accounts' EmployeeLeave_Monday= 'YES' EmployeeLeave_Tuesday= 'YES' EmployeeLeave_Thursday= 'YES' } # 应用上述代码 $leaveCount = ($sampleEmp.PSObject.Properties.Value | Where-Object { $_ -eq 'YES' }).Count $sampleEmp | Add-Member -NotePropertyName "EmployeeTotal_LeaveCount" -NotePropertyValue $leaveCount # 输出结果 $sampleEmp
输出会是:
EmployeeID : MACL22656 EmployeeRole : Accountant EmployeeDepartment : Accounts EmployeeLeave_Monday : YES EmployeeLeave_Tuesday: YES EmployeeLeave_Thursday: YES EmployeeTotal_LeaveCount : 3
完全符合你的预期!
内容的提问来源于stack exchange,提问作者Rahul Trivedi
相关产品推荐
相关产品推荐

