ConvertTo-Csv

将 .NET 对象转换为一系列字符分隔值 (CSV) 字符串。

语法

ConvertTo-Csv
              [-InputObject] <PSObject>
              [[-Delimiter] <Char>]
              [-IncludeTypeInformation]
              [-NoTypeInformation]
              [-QuoteFields <String[]>]
              [-UseQuotes <QuoteKind>]
              [-NoHeader]
              [<CommonParameters>]
ConvertTo-Csv
              [-InputObject] <PSObject>
              [-UseCulture]
              [-IncludeTypeInformation]
              [-NoTypeInformation]
              [-QuoteFields <String[]>]
              [-UseQuotes <QuoteKind>]
              [-NoHeader]
              [<CommonParameters>]

说明

ConvertTo-CSV cmdlet 返回一系列字符分隔值 (CSV) 字符串,这些字符串表示提交的对象。 然后,可以使用 ConvertFrom-Csv cmdlet 从 CSV 字符串重新创建对象。 从 CSV 转换的对象是包含属性值和无方法的原始对象的字符串值。

可以使用 Export-Csv cmdlet 将对象转换为 CSV 字符串。 Export-CSV 类似于 ConvertTo-CSV,只不过将 CSV 字符串保存到文件中。

ConvertTo-CSV cmdlet 具有参数来指定逗号以外的分隔符,或使用当前区域性作为分隔符。

示例

示例 1:将对象转换为 CSV

此示例将 Process 对象转换为 CSV 字符串。

Get-Process -Name pwsh | ConvertTo-Csv -NoTypeInformation

"Name","SI","Handles","VM","WS","PM","NPM","Path","Parent","Company","CPU","FileVersion", ...
"pwsh","8","950","2204001161216","100925440","59686912","67104", ...

Get-Process cmdlet 获取 Process 对象,并使用 Name 参数指定 PowerShell 进程。 进程对象将管道向下发送到 ConvertTo-CSV cmdlet。 ConvertTo-CSV cmdlet 将对象转换为 CSV 字符串。 NoTypeInformation 参数从 CSV 输出中删除 #TYPE 信息标头,并且不需要在 PowerShell 6 中。

示例 2:将 DateTime 对象转换为 CSV

此示例将 DateTime 对象转换为 CSV 字符串。

$Date = Get-Date
ConvertTo-Csv -InputObject $Date -Delimiter ';' -NoTypeInformation

"DisplayHint";"DateTime";"Date";"Day";"DayOfWeek";"DayOfYear";"Hour";"Kind";"Millisecond";"Minute";"Month";"Second";"Ticks";"TimeOfDay";"Year"
"DateTime";"Friday, January 4, 2019 14:40:51";"1/4/2019 00:00:00";"4";"Friday";"4";"14";"Local";"711";"40";"1";"51";"636822096517114991";"14:40:51.7114991";"2019"

Get-Date cmdlet 获取 DateTime 对象,并将其保存在 $Date 变量中。 ConvertTo-Csv cmdlet 将 DateTime 对象转换为字符串。 InputObject 参数使用存储在 $Date 变量中的 DateTime 对象。 分隔符 参数指定分隔字符串值的分号。 NoTypeInformation 参数从 CSV 输出中删除 #TYPE 信息标头,并且不需要在 PowerShell 6 中。

示例 3:将 PowerShell 事件日志转换为 CSV

此示例将 PowerShell 的 Windows 事件日志转换为一系列 CSV 字符串。

(Get-Culture).TextInfo.ListSeparator
Get-WinEvent -LogName 'PowerShellCore/Operational' |
    ConvertTo-Csv -UseCulture -NoTypeInformation

,
"Message","Id","Version","Qualifiers","Level","Task","Opcode","Keywords","RecordId", ...
"Error Message = System error""4100","1",,"3","106","19","0","31716","PowerShellCore", ...

Get-Culture cmdlet 使用 TextInfo 嵌套属性ListSeparator 并显示当前区域性的默认列表分隔符。 Get-WinEvent cmdlet 获取事件日志对象,并使用 LogName 参数指定日志文件名称。 事件日志对象将管道向下发送到 ConvertTo-Csv cmdlet。 ConvertTo-Csv cmdlet 将事件日志对象转换为一系列 CSV 字符串。 UseCulture 参数使用当前区域性的默认列表分隔符作为分隔符。 NoTypeInformation 参数从 CSV 输出中删除 #TYPE 信息标头,并且不需要在 PowerShell 6 中。

示例 4:转换为包含两列引号的 CSV

此示例将 DateTime 对象转换为 CSV 字符串。

Get-Date | ConvertTo-Csv -QuoteFields "DateTime","Date"

DisplayHint,"DateTime","Date",Day,DayOfWeek,DayOfYear,Hour,Kind,Millisecond,Minute,Month,Second,Ticks,TimeOfDay,Year
DateTime,"Thursday, August 22, 2019 11:27:34 AM","8/22/2019 12:00:00 AM",22,Thursday,234,11,Local,569,27,8,34,637020700545699784,11:27:34.5699784,2019

示例 5:仅在需要时使用引号转换为 CSV

此示例将 DateTime 对象转换为 CSV 字符串。

Get-Date | ConvertTo-Csv -UseQuotes AsNeeded

DisplayHint,DateTime,Date,Day,DayOfWeek,DayOfYear,Hour,Kind,Millisecond,Minute,Month,Second,Ticks,TimeOfDay,Year
DateTime,"Thursday, August 22, 2019 11:31:00 AM",8/22/2019 12:00:00 AM,22,Thursday,234,11,Local,713,31,8,0,637020702607132640,11:31:00.7132640,2019

示例 6:将哈希表转换为 CSV

在 PowerShell 7.2 及更高版本中,将哈希表转换为 CSV 时,第一个哈希表的键将序列化并用作输出中的标头。

$person1 = @{
    Name = 'John Smith'
    Number = 1
}

$person2 = @{
    Name = 'Jane Smith'
    Number = 2
}

$allPeople = $person1, $person2
$allPeople | ConvertTo-Csv

"Name","Number"
"John Smith","1"
"Jane Smith","2"

示例 7:使用其他属性将哈希表转换为 CSV

在 PowerShell 7.2 及更高版本中,转换具有添加 Add-MemberSelect-Object 附加属性的哈希表时,其他属性也会作为 CSV 输出中的标头添加。

$allPeople | Add-Member -Name ExtraProp -Value 42
$allPeople | ConvertTo-Csv

"Name","Number","ExtraProp"
"John Smith","1","42"
"Jane Smith","2","42"

每个哈希表都有一个名为 ExtraProp 的属性,该属性由 Add-Member 添加,然后转换为 CSV。 可以看到 ExtraProp 现在是输出中的标头。

如果添加的属性 与哈希表中的键相同的 名称,则键优先,并且仅将密钥转换为 CSV。

参数

-Delimiter

指定分隔符以分隔 CSV 字符串中的属性值。 默认值为逗号(,)。 输入字符,如冒号(:)。 若要指定分号(;),请将它括在单引号中。

类型:Char
Position:1
默认值:comma (,)
必需:False
接受管道输入:False
接受通配符:False

-IncludeTypeInformation

使用此参数时,输出的第一行包含 #TYPE 后跟对象类型的完全限定名称。 例如,#TYPE System.Diagnostics.Process

此参数是在 PowerShell 6.0 中引入的。

类型:SwitchParameter
别名:ITI
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-InputObject

指定转换为 CSV 字符串的对象。 输入包含对象或键入获取对象的命令或表达式的变量。 还可以通过管道将对象传递给 ConvertTo-CSV

类型:PSObject
Position:0
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-NoHeader

使用此参数时,cmdlet 不会将包含列名的标题行写入输出。

此参数已在 PowerShell 7.4 中添加。

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-NoTypeInformation

从输出中删除 #TYPE 信息标头。 此参数在 PowerShell 6.0 中成为默认值,并包含在后向兼容性中。

类型:SwitchParameter
别名:NTI
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-QuoteFields

指定应带引号的列的名称。 仅当使用此参数时,将引用指定的列。 此参数已在 PowerShell 7.0 中添加。

类型:String[]
别名:QF
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-UseCulture

将当前区域性的列表分隔符用作项分隔符。 若要查找区域性的列表分隔符,请使用以下命令:(Get-Culture).TextInfo.ListSeparator

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-UseQuotes

指定 CSV 文件中何时使用引号。 可能的值包括:

  • 从不 - 不要引用任何内容
  • 始终 - 引用所有内容(默认行为)
  • AsNeeded - 仅包含分隔符字符、双引号或换行符的引号字段

此参数已在 PowerShell 7.0 中添加。

类型:Microsoft.PowerShell.Commands.BaseCsvWritingCommand+QuoteKind
别名:UQ
Position:Named
默认值:Always
必需:False
接受管道输入:False
接受通配符:False

输入

PSObject

可以通过管道将具有扩展类型系统(ETS)适配器的任何对象传递给此 cmdlet。

输出

String

此 cmdlet 返回一个或多个表示每个已转换对象的字符串。

备注

在 CSV 格式中,每个对象都由其属性值的字符分隔列表表示。 属性值使用对象的 ToString() 方法转换为字符串。 字符串由属性值名称表示。 ConvertTo-CSV 不导出对象的方法。

CSV 字符串输出如下:

  • 如果使用 IncludeTypeInformation,则第一个字符串由 #TYPE 后跟对象类型的完全限定名称组成。 例如,#TYPE System.Diagnostics.Process
  • 如果未使用 IncludeTypeInformation,则第一个字符串包含列标题。 标头包含第一个对象的属性名称作为字符分隔的列表。
  • 其余字符串包含每个对象的属性值的字符分隔列表。

从 PowerShell 6.0 开始,ConvertTo-CSV 的默认行为是不包括 CSV 中的 #TYPE 信息,NoTypeInformation 隐含。 IncludeTypeInformation 可用于包含 #TYPE 信息,并模拟 PowerShell 6.0 之前 ConvertTo-CSV 的默认行为。

将多个对象提交到 ConvertTo-CSV时,ConvertTo-CSV 根据提交的第一个对象的属性对字符串进行排序。 如果其余对象没有指定属性之一,则该对象的属性值为 Null,由两个连续逗号表示。 如果其余对象具有其他属性,则忽略这些属性值。