ZetCode

PowerShell ConvertTo-Csv

最后修改:2025 年 2 月 15 日

本文介绍PowerShell中的ConvertTo-Csv cmdlet。它将对象转换为一系列CSV字符串。此cmdlet对于数据导出和与其他系统的互操作性非常有用。

CSV基础知识

CSV(逗号分隔值)是一种用于存储表格数据的简单文件格式。每一行代表一个记录,字段之间用逗号分隔。PowerShell对象可以序列化为CSV格式以进行存储或传输。ConvertTo-Csv cmdlet负责此转换。

基本ConvertTo-Csv用法

使用ConvertTo-Csv的最简单方法是将其通过管道传输对象。该cmdlet输出表示输入对象的CSV字符串。第一行包含列标题。随后的行包含属性值。

csv1.ps1
Get-Process | Select-Object -First 3 | ConvertTo-Csv

此命令获取三个进程并将其转换为CSV格式。输出包括标题和三行数据。每个属性都成为CSV输出中的一列。

PS C:\> .\csv1.ps1
"Name","Id","PriorityClass","FileVersion","HandleCount","WorkingSet","PagedMemorySize","PrivateMemorySize","VirtualMemorySize","TotalProcessorTime","SI","Handles","VM","WS","PM","NPM","Path","Company","CPU","ProductVersion","Description","Product","BasePriority","ExitCode","HasExited","ExitTime","Handle","SafeHandle","MachineName","MainWindowHandle","MainWindowTitle","MainModule","MaxWorkingSet","MinWorkingSet","Modules","NonpagedSystemMemorySize","NonpagedSystemMemorySize64","PagedMemorySize64","PagedSystemMemorySize","PagedSystemMemorySize64","PeakPagedMemorySize","PeakPagedMemorySize64","PeakWorkingSet","PeakWorkingSet64","PeakVirtualMemorySize","PeakVirtualMemorySize64","PriorityBoostEnabled","PrivateMemorySize64","PrivilegedProcessorTime","ProcessName","ProcessorAffinity","Responding","SessionId","StartInfo","StartTime","SynchronizingObject","Threads","TotalProcessorTime","UserProcessorTime","VirtualMemorySize64","EnableRaisingEvents","StandardInput","StandardOutput","StandardError","WorkingSet64","Site","Container"
"ApplicationFrameHost","11928","Normal","10.0.19041.746 (WinBuild.160101.0800)","338","43417600","24862720","24862720","24862720","00:00:00.0312500",1,"338","24862720","43417600","24862720","24862720","C:\WINDOWS\system32\ApplicationFrameHost.exe","Microsoft Corporation","0.03125","10.0.19041.746","Application Frame Host","Microsoft® Windows® Operating System","8",,,,"11928",,".",0,"",,,,"0","0","24862720","0","0","24862720","24862720","43417600","43417600","24862720","24862720",True,"24862720","00:00:00.0156250","ApplicationFrameHost","1",True,1,,,,,"00:00:00.0312500","00:00:00.0156250","24862720",False,,,,,"43417600",,
"armsvc","1108","Normal",,"43","1269760","0","0","0","00:00:00",1,"43","0","1269760","0","0",,,,"0",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
"audiodg","2588","Normal","10.0.19041.1 (WinBuild.160101.0800)","156","17653760","0","0","0","00:00:00.0156250",1,"156","0","17653760","0","0","C:\WINDOWS\system32\audiodg.exe","Microsoft Corporation","0.015625","10.0.19041.1","Windows Audio Device Graph Isolation","Microsoft® Windows® Operating System","13",,,,"2588",,".",0,"",,,,"0","0","0","0","0","0","0","17653760","17653760","0","0",True,"0","00:00:00","audiodg","1",True,0,,,,,"00:00:00.0156250","00:00:00.0156250","0",False,,,,,"17653760",,

CSV输出中的自定义分隔符

默认情况下,ConvertTo-Csv使用逗号作为分隔符。您可以使用-Delimiter参数指定不同的分隔符。当逗号是数据的一部分时,这很有用。常见的替代方法包括分号或制表符。

csv2.ps1
Get-Service | Select-Object -First 3 | ConvertTo-Csv -Delimiter ";"

此命令以分号分隔符将服务信息转换为CSV。输出结构保持不变,但使用分号而不是逗号。这种格式在欧洲地区通常更受欢迎。

排除类型信息

ConvertTo-Csv默认在第一行包含类型信息。您可以使用-NoTypeInformation参数禁止此操作。这可以为大多数应用程序创建更干净的CSV文件。输出直接以列标题开始。

csv3.ps1
Get-Process | Select-Object -First 3 | ConvertTo-Csv -NoTypeInformation

此命令生成不带类型信息行的CSV输出。结果与标准CSV解析器更兼容。仅包含属性标题和数据行。

选择特定属性

您可以控制CSV输出中包含哪些属性。在转换为CSV之前,请使用Select-Object。这可以减小文件大小并专注于相关数据。输出中只会显示指定的属性。

csv4.ps1
Get-Process | Select-Object Name, Id, CPU | ConvertTo-Csv -NoTypeInformation

此命令仅将进程名称、ID和CPU使用率导出到CSV。输出比完整的对象转换更简洁。您可以指定输入对象上可用的任何属性。

将CSV保存到文件

虽然ConvertTo-Csv将输出到控制台,但您可以将其重定向到文件。使用重定向运算符(>)或Out-File cmdlet。这会创建持久的CSV文件以供以后使用。该文件可以在Excel或其他工具中打开。

csv5.ps1
Get-Service | ConvertTo-Csv -NoTypeInformation | Out-File services.csv

此命令将服务信息保存到services.csv。文件包含CSV格式的数据,可供其他地方导入。始终使用-NoTypeInformation以获得干净的文件输出。

使用自定义对象

ConvertTo-Csv可与任何PowerShell对象一起使用,包括自定义对象。您可以使用New-Object或带有计算属性的Select-Object创建对象。该cmdlet处理这些对象的方式与系统对象相同。

csv6.ps1
$customObjects = @(
    [PSCustomObject]@{Name="Server1"; Status="Online"; Uptime=120}
    [PSCustomObject]@{Name="Server2"; Status="Offline"; Uptime=0}
    [PSCustomObject]@{Name="Server3"; Status="Online"; Uptime=360}
)

$customObjects | ConvertTo-Csv

此示例创建自定义对象并将其转换为CSV。输出包括标题和数据行中的所有已定义属性。自定义对象遵循与系统对象相同的转换规则。

来源

PowerShell 文档

本文介绍了PowerShell中的ConvertTo-Csv cmdlet。我们探讨了数据转换的基本用法和高级场景。

作者

我叫Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自2007年以来一直在撰写编程文章。迄今为止,我已撰写了1400多篇文章和8本电子书。我在教授编程方面拥有超过十年的经验。

列出 所有 PowerShell 教程