You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell移除CSV空白行:优化Get-SWList脚本的问题

解决PowerShell导出CSV空白行问题

你的函数导出CSV出现空白行,核心原因有两个:

  1. finally块里用Out-File追加$logDate的操作,不仅破坏了CSV格式,还因为编码、换行符不匹配产生空白行;
  2. 若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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:21:11