You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:57:24