创建CSV可导出对象数组时如何控制列名称位置?

时间:2014-09-04 15:58:03

标签: powershell export-to-csv powershell-v4.0 psobject

REFERENCE SCRIPTS:

脚本1:

$csvList = @()

$csvList += New-Object PSObject -Property @{name="test1";accountname="testuser1";mail="user1@somewhere.com"}
$csvList += New-Object PSObject -Property @{name="test2";accountname="testuser2";mail="user2@somewhere.com"}
$csvList += New-Object PSObject -Property @{name="test3";accountname="testuser3";mail="user3@somewhere.com"}
$csvList += New-Object PSObject -Property @{name="test4";accountname="testuser4";mail="user4@somewhere.com"}

$csvList | Export-Csv c:\temp\testcsv.csv -NoTypeInformation

脚本2(在编辑中添加以反映扩展用法):

$aTest = @()

for($x=0;$x -le 5;$x++)
{
    $aTest += New-Object PSObject -Property @{Name="test$($x)"; `
                                              AccountName="testuser$($x)"; `
                                              Mail="user$($x)@somewhere.com"}
}

$aTest | Export-Csv c:\temp\testcsv.csv -NoTypeInformation

问题:

虽然该脚本创建了我的CSV并在正确的行中包含了我需要的所有数据,但我无法弄清楚如何控制列位置。即使我按name,accountname,mail排序并添加数据,Powershell也会按mail,name,accountname对其进行排序。 如何控制列顺序?

注意:如果我在导出之前对$csvList的内容进行了屏幕转储,则订单已经更改。

2 个答案:

答案 0 :(得分:3)

每个PSObject本质上都是一个哈希表。哈希表中没有值的排序。 Select-Object可以为您重新格式化订单。 建立你的最后一行:

 $csvList | Select-Object name,accountname,mail | Export-Csv c:\temp\testcsv2.csv -NoTypeInformation

从这个论坛问题得到了想法:Source

答案 1 :(得分:2)

如果您正在运行V4,他们添加了一个类型加速器([PSCustomObject]),用于创建使用有序哈希表的PS对象,因此属性保持在哈希文字中声明的顺序。

$(
[PSCustomObject]@{name="test1";accountname="testuser1";mail="user1@somewhere.com"}
[PSCustomObject]@{name="test2";accountname="testuser2";mail="user2@somewhere.com"}
[PSCustomObject]@{name="test3";accountname="testuser3";mail="user3@somewhere.com"}
[PSCustomObject]@{name="test4";accountname="testuser4";mail="user4@somewhere.com"}
) | Export-Csv c:\temp\testcsv.csv -NoTypeInformation

编辑:使用循环构建有序哈希表的示例:

foreach ($i in 1..4)
 {
   $ht = [ordered]@{}
   $ht.name = "test$i"
   $ht.accountname = "testuser$i"
   $ht.mail = "user$i@somewhere.com"
   [PSCustomObject] $ht
 }