3

参考脚本:

脚本 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,mailPowershell 订购和添加数据,也订购了mail,name,accountname. 如何控制列顺序?

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

4

2 回答 2

3

如果您运行的是 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
 }
于 2014-09-04T16:11:43.297 回答
3

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

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

从这个论坛问题中得到了这个想法:来源

于 2014-09-04T16:04:04.960 回答