PowerShell导出CSV后Excel显示单行,如何改为每行一个应用?
解决方法
问题出在你把所有应用名称和版本拼接成了一个字符串,最终只生成了一个对象,所以导出CSV后只有一行。要让每个应用占一行,需要为每个应用单独创建一个自定义对象,再导出到CSV。
修改后的脚本如下:
$currentUsername = $env:USERNAME $computerName = $env:COMPUTERNAME $timeStamp = Get-Date -Format "ss-mm-HH-dd/MM/yyyy" $desktopPath = [System.IO.Path]::Combine($env:USERPROFILE, 'Desktop') $outputFileName = "${timeStamp}_${currentUsername}_${computerName}.csv" $outputFile = [System.IO.Path]::Combine($desktopPath, $outputFileName) # 获取已安装应用,过滤掉无显示名称的条目 $installedApps = Get-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.DisplayName -ne $null } # 为每个应用创建独立的自定义对象 $appObjects = $installedApps | ForEach-Object { [PSCustomObject]@{ "已安装应用" = $_.DisplayName "版本" = $_.DisplayVersion } } # 导出到CSV,保留分号分隔符和UTF8编码 $appObjects | Export-Csv -Path $outputFile -NoTypeInformation -Delimiter ";" -Encoding UTF8
关键改动说明
- 移除了原脚本中把所有应用拼接成字符串的逻辑,改为在
ForEach-Object里为每个应用生成一个包含“已安装应用”和“版本”属性的自定义对象。 - 导出时直接使用包含所有应用对象的数组
$appObjects,Export-Csv会自动为每个对象生成一行数据。 - 将应用名称和版本拆分到不同列,在Excel中查看更清晰;如果需要把名称和版本放在同一列,可调整自定义对象的属性。
可选:名称和版本同列的版本
如果仍希望应用名称和版本在同一列,修改ForEach-Object部分即可:
$appObjects = $installedApps | ForEach-Object { [PSCustomObject]@{ "已安装应用" = "$($_.DisplayName) ($($_.DisplayVersion))" } }
内容的提问来源于stack exchange,提问作者Dominic
相关产品推荐
相关产品推荐

