PowerShell移除CSV空白行:优化Get-SWList脚本的问题
解决PowerShell导出CSV空白行问题
你的函数导出CSV出现空白行,核心原因有两个:
finally块里用Out-File追加$logDate的操作,不仅破坏了CSV格式,还因为编码、换行符不匹配产生空白行;- 若
Get-WmiObject未返回任何数据,Export-Csv会生成仅含表头的文件,后续追加操作会进一步导致多余空白。
以下是两种可行的解决方法:
方法一:将日志日期整合到CSV数据中(推荐)
直接给每个软件条目添加日志日期列,既不破坏CSV格式,也不会产生空白行:
function Get-SWList { try { # 获取软件列表并新增日志日期列 $softwareList = Get-WmiObject Win32_Product -ComputerName $PCname -ErrorAction Stop | Select-Object Name, Version, @{Name='LogDate'; Expression={$logDate}} # 指定编码导出,避免乱码和换行问题 $softwareList | Export-Csv "$logLocation${PCname}.csv" -NoTypeInformation -Encoding UTF8 } catch { # 可选:添加错误日志,方便排查问题 "[$logDate] 无法获取 $PCname 的软件列表: $_" | Out-File "$logLocation\error.log" -Append } }
方法二:正确追加日志日期到CSV末尾
如果一定要把日期单独放在文件最后,需保证编码一致,且生成符合CSV格式的行进行追加:
function Get-SWList { try { Get-WmiObject Win32_Product -ComputerName $PCname -ErrorAction Stop | Select-Object Name, Version | Export-Csv "$logLocation${PCname}.csv" -NoTypeInformation -Encoding UTF8 # 用Add-Content替代Out-File,指定相同编码,生成合规的CSV行 "`"日志日期`",`"$logDate`"" | Add-Content "$logLocation${PCname}.csv" -Encoding UTF8 } catch {} }
额外提醒
Win32_Product存在隐性问题:查询该类会触发系统MSI安装程序自检,可能导致不必要的软件修复操作。建议换成读取注册表的方式获取软件列表,更高效安全:
function Get-SWList { try { # 定义32位和64位软件的注册表路径 $uninstallPaths = @( "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" ) $softwareList = foreach ($path in $uninstallPaths) { Get-CimInstance -ClassName Win32_RegistryValue -ComputerName $PCname -Namespace root\default -Filter "KeyPath='$path' AND ValueName='DisplayName'" | ForEach-Object { # 获取对应软件的版本信息 $versionKey = Get-CimInstance -ClassName Win32_RegistryValue -ComputerName $PCname -Namespace root\default -Filter "KeyPath='$($_.KeyPath)' AND ValueName='DisplayVersion'" [PSCustomObject]@{ Name = $_.Value Version = if ($versionKey) { $versionKey.Value } else { "未知版本" } LogDate = $logDate } } } $softwareList | Export-Csv "$logLocation${PCname}.csv" -NoTypeInformation -Encoding UTF8 } catch { "[$logDate] 无法获取 $PCname 的软件列表: $_" | Out-File "$logLocation\error.log" -Append } }
内容的提问来源于stack exchange,提问作者wastingLifeAway
相关产品推荐
相关产品推荐

