PowerShell对比远程程序与CSV清单时如何按条件给输出行上色
实现方案
你可以通过逐行判断不匹配类型,配合Write-Host指定前景色实现标红需求,同时对原脚本做了性能优化,避免循环内重复读取CSV文件:
# 提前导入基准程序清单,避免循环内重复IO $defaultProgs = Import-Csv -Path "...\defprograms.csv" -Delimiter ';' # 获取远程设备程序列表 $remoteProgs = Get-WmiObject -ComputerName <ComputerName> -Class Win32_Product # 先筛选出所有和基准不完全匹配的程序 $unmatched = $remoteProgs | Where-Object { $cur = $_ -not ($defaultProgs | Where-Object { $_.Name -eq $cur.Name -and $_.Version -eq $cur.Version -and $_.Vendor -eq $cur.Vendor }) } | Sort-Object Name # 逐行输出并按规则标色 foreach ($prog in $unmatched) { # 判断是否为仅版本不匹配(名称、厂商均和基准一致) $versionOnlyMismatch = $defaultProgs | Where-Object { $_.Name -eq $prog.Name -and $_.Vendor -eq $prog.Vendor } $outputLine = "{0,-65} {1,-18} {2,-25} {3}" -f $prog.Name, $prog.Version, $prog.Vendor, $prog.InstallDate if ($versionOnlyMismatch) { Write-Host $outputLine -ForegroundColor Red } else { Write-Host $outputLine } }
说明
- 原脚本循环内每次都导入CSV,会产生大量不必要的IO操作,提前导入到变量后运行效率会提升很多
- 因为PowerShell自带的
Format-Table无法单独为某一行设置颜色,所以用字符串格式化-f控制列对齐,配合Write-Host的-ForegroundColor参数实现标红效果,你可以调整格式化字符串里的数值来适配你需要的列宽 - 额外提示:
Win32_Product查询时会触发所有MSI安装包的一致性校验,可能会导致设备卡顿甚至自动触发程序修复,如果你对性能要求较高,可以替换为从HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*注册表路径读取安装程序信息。
内容的提问来源于stack exchange,提问作者jerkdavi
相关产品推荐
相关产品推荐

