调用ConvertTo-Csv后,无法将简单对象保存为CSV

时间:2018-02-14 23:02:46

标签: powershell csv object

我使用CopnverTo-Csv将对象转换为正确的格式。如果您问我,那么将该内容保存到CSV文件应该非常简单,否则 ConvertTo-Csv的重点是什么 ???

我设法使用此行

将对象转换为所需的格式
$checkListCsv = $checkListObject | Get-Member -MemberType NoteProperty | Select-Object @{name='Name';expression={$_.name}},@{name='Value';expression={$object.($_.name)}} | ConvertTo-Csv

当我在控制台中输入$checkListCsv时,我看到了

#TYPE Selected.Microsoft.PowerShell.Commands.MemberDefinition
"Name","Value"
"1 week follow up completed",
"Add to print server",
"Add username to Computer description in AD",
"Additional approved software installation",
"BitLocker enrolment as Admin and user",
"Description",
"Email signature",
"Existing approved none-standard software",
"Hibernation off",
"Install Itunes",
"Install Java",
"Label machine",
"Log into SmartNet",
"Map network drives",
"Map network printers",
"New Machine Name",
"New Machine Serial",
"New Starter",
"Old Machine Name",
"Print card number",
"Sign into OneDrive",
"Skype contact",
"Sound",
"Starting Date",
"Technician",
"Time zone",
"Update required hardware drivers",
"Update ServiceNow",
"User",
"User Data and existing mailboxes",
"VPN client",
"Wireless",
"WP OU",

完美!

现在我要做的就是将其保存到csv文件中,但出于某种原因,我无法解决这个问题。

我试过

$checkListCsv | Export-Csv -Path "C:\temp\CheckList.csv"

但是csv文件现在包含

#TYPE System.String
Length
61
14
29
22
45
44
40
14
18
43
18
17
15
16
20
21
23
19
21
14
19
20
21
16
8
16
13
12
35
20
7
35
13
11
8

我尝试.ToString(),但这只是输出

System.Object[]

多烦啊保存内容的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

直接导出到csv:

$checkListObject |
    Get-Member -MemberType NoteProperty |
    Select-Object @{name='Name';expression={$_.name}},@{name='Value';expression={$object.($_.name)}}
    Export-Csv -Path "C:\temp\CheckList.csv"

或者,如果您在其他地方使用$checkListCsv,请完全删除ConvertTo-Csv

$checkListCsv = $checkListObject |
    Get-Member -MemberType NoteProperty |
    Select-Object @{name='Name';expression={$_.name}},@{name='Value';expression={$object.($_.name)}}

    $checkListCsv |Export-Csv -Path "C:\temp\CheckList.csv"

或者使用Out-File(不是真的推荐,只是为了完整性)

$checkListCsv = $checkListObject |
    Get-Member -MemberType NoteProperty |
    Select-Object @{name='Name';expression={$_.name}},@{name='Value';expression={$object.($_.name)}} |
    ConvertTo-Csv

    $checkListCsv | Out-File -Path "C:\temp\CheckList.csv"

进一步说明

ConvertTo-Csv Cmdlet接受一个对象,并返回一个字符串(如果你有多行,则返回一个字符串数组)。字符串只有一个属性 - Length

Export-Csv Cmdlet接受一个对象,并导出该对象的属性。所以直接传递一个对象。如果你第一次使用ConvertTo-Csv,你基本上将它传递给字符串数组,并打印出每行的长度......

Out-File喜欢字符串并会打印出你在控制台中获得的内容,但如果您的最终目标是CSV文件,它会长篇大论且毫无意义。