powershell 通过 export-csv 导出 utf-8 编码的 csv 文件,可直接被 excel 正确打开并显示中文;配合筛选、排序、时间戳和计算属性,能生成清晰、可追溯、无乱码的实用报表。
powershell 本身不直接生成 .xlsx 文件,但 export-csv 能导出标准 csv 格式——这是 excel 原生支持、打开即用的通用报表格式。只要注意编码、字段选择和路径规范,就能生成清晰、无乱码、可直接双击用 excel 打开的“准 excel 报表”。
导出 CSV 就是导出 Excel 可读报表的核心方式
Excel 默认把 .csv 当作工作表打开(中文系统下需 UTF-8 编码),无需额外转换。比 COM 或 ImportExcel 模块更轻量、稳定、跨 PowerShell 版本兼容。
确保中文不乱码:必须指定 -Encoding UTF8
Windows 自带记事本默认用 ANSI 打开 CSV,导致中文显示为方块。而 Excel 2016+ 默认识别 UTF-8 BOM ——所以加 -Encoding UTF8 是关键,不是可选项。
Get-Service | Select-Object Name, DisplayName, Status, StartType | Export-Csv -Path "$env:USERPROFILE\Desktop\services.csv" -NoTypeInformation -Encoding UTF8
执行后,双击桌面 services.csv,Excel 会正确显示中文服务名和状态。
按需筛选与排序,让报表更实用
直接导出全部服务可能信息过载。建议先过滤再导出:
-
只导出已停止的服务(便于排查异常):
Get-Service | Where-Object { $_.Status -eq 'Stopped' } | Select-Object Name, DisplayName, StartType | Export-Csv "$env:USERPROFILE\Desktop\stopped_services.csv" -NoTypeInformation -Encoding UTF8 -
按状态分组、再按名称排序,提升可读性:
Get-Service | Sort-Object Status, Name | Select-Object Name, DisplayName, Status, StartType | Export-Csv "$env:USERPROFILE\Desktop\services_sorted.csv" -NoTypeInformation -Encoding UTF8
加时间戳避免文件覆盖
日常运维中重复导出容易覆盖旧报表。一行加时间戳即可解决:
$ts = Get-Date -Format "yyyyMMdd_HHmmss" Get-Service | Select-Object Name, DisplayName, Status, StartType | Export-Csv "$env:USERPROFILE\Desktop\services_$ts.csv" -NoTypeInformation -Encoding UTF8
生成文件如 services_20260721_174522.csv,清晰可追溯。
注意字段别名与空值处理Select-Object 中若引用不存在的属性(如 Description 对某些服务为空),CSV 里对应列会显示 "";若想统一显示“未设置”,可用计算属性:
Get-Service | Select-Object Name, DisplayName, Status,
@{Name='StartType';Expression={$_.StartType}},
@{Name='Description';Expression={$_.DisplayName ?? '未设置'}} |
Export-Csv "$env:USERPROFILE\Desktop\services_safe.csv" -NoTypeInformation -Encoding UTF8
不复杂但容易忽略











