PowerShell使用Export-Csv导出CSV时如何控制列排序顺序
问题根因
使用New-Object -Property @{}创建自定义对象时,传入的参数是无序哈希表,PowerShell默认的哈希表不会存储键的编写顺序,对象生成后属性的排列顺序由键的哈希计算结果决定,和你写代码时的属性先后顺序完全无关。修改属性名后排序规则变化,本质就是键名变了对应的哈希值变了,排列顺序自然改变。
可行解决方案
以下三种方法任选其一即可:
- 方法1:导出时显式指定列顺序
不需要修改现有对象创建逻辑,在导出CSV前通过Select-Object按目标顺序指定属性即可,兼容性最好,所有PowerShell版本通用。# 按需要的列顺序传入属性名,追加-NoTypeInformation去掉CSV默认生成的类型头行 $UserGroups | Select-Object Name,Email,AccessLevel,Status,Created,LastAccess | Export-Csv -Path c:\temp\users.csv -NoTypeInformation - 方法2:用有序哈希表创建对象
只需要在原有哈希表前加[ordered]修饰符(PowerShell 3.0及以上版本支持),创建的对象会严格保留你写属性的顺序,改造成本极低。foreach($au in $allUsers.members) { $UserGroups += New-Object -TypeName PSObject -Property [ordered]@{ Name = $au.user.displayName Email = $au.user.principalName AccessLevel = $au.accessLevel.licenseDisplayName Status = $au.accessLevel.status Created = $au.dateCreated LastAccess = $au.lastAccessedDate } } - 方法3:用
[pscustomobject]类型加速器创建对象
这是PowerShell 3.0之后推荐的自定义对象创建写法,语法更简洁,默认会保留属性定义顺序,不需要额外加修饰符。# 直接把循环结果赋值给数组,避免+=追加数组带来的性能损耗 $UserGroups = foreach($au in $allUsers.members) { [pscustomobject]@{ Name = $au.user.displayName Email = $au.user.principalName AccessLevel = $au.accessLevel.licenseDisplayName Status = $au.accessLevel.status Created = $au.dateCreated LastAccess = $au.lastAccessedDate } }
补充说明:用
+=追加数组元素时,每次操作都会重新创建整个数组、复制全部已有元素,当用户量较大时脚本运行速度会明显变慢,直接将循环表达式的结果赋值给变量是PowerShell里更高效的数组创建写法。
内容的提问来源于stack exchange,提问作者user19542410
相关产品推荐
相关产品推荐

