PowerShell处理CSV服务列表时如何合并不同属性的自定义对象
问题根因
PowerShell默认以数组中第一个对象的属性集合作为输出的表头规则,后续对象独有的属性不会被自动纳入展示列,所以会出现缺列问题。
解决方法
有两种常用实现方案,可按需选择:
方案1:修改原有函数,预收集全量服务列
先遍历一遍CSV拿到所有出现过的服务名,生成每个计算机对象时补全所有服务属性,保证所有对象属性完全一致:
function Get-ServiceStatus { [CmdletBinding()] param( [Parameter(Mandatory=$False)] [string] $ServiceListPath ) BEGIN { # 导入CSV,生产环境替换为Import-Csv $ServiceListPath即可 $CSVListTemp = @" Computer,services localhost1,winrm;webclient localhost2,soundservice;netlogon;www localhost3,someservice "@ $Csv = $CSVListTemp | ConvertFrom-CSV $ObjArray = @() # 新增:预收集所有出现过的服务名,去重得到全量列 $AllServices = $Csv | ForEach-Object { $_.services -split ';' } | Select-Object -Unique } PROCESS { ForEach ($Row in $Csv) { write-host $Row.Computer -ForegroundColor Green $obj = [PSCustomObject]@{ Computer = $Row.Computer } $CurrentServiceList = $Row.Services -split ';' # 遍历全量服务列表,给对象补全所有属性 foreach ($Service in $AllServices) { if ($Service -in $CurrentServiceList) { # 这里替换为实际的服务状态查询逻辑,示例用模拟值 $status = if ((Get-Random -Maximum 2) -eq 0) { "running" } else { "stopped" } } else { $status = $null # 不存在的服务留空 } $obj | Add-Member -Name $Service -Type NoteProperty -Value $status -Force } $ObjArray += $obj } Return $objarray } } # 调用后直接输出就是完整列的结果 Get-ServiceStatus
方案2:不修改原函数,输出时手动指定全量属性
如果不想调整原有逻辑,可以在拿到函数返回结果后,先提取所有对象的全部属性再输出:
# 拿到原函数返回结果 $serviceResult = Get-ServiceStatus # 提取所有对象的属性名,去重得到全量列 $allColumns = $serviceResult | ForEach-Object { $_.PSObject.Properties.Name } | Select-Object -Unique # 指定全量列输出 $serviceResult | Select-Object $allColumns
内容的提问来源于stack exchange,提问作者Aziz
相关产品推荐
相关产品推荐

