【问题标题】:Why does powershell rearrange my output? [duplicate]为什么 powershell 会重新排列我的输出? [复制]
【发布时间】:2017-02-17 14:52:16
【问题描述】:

我在我的函数中构建了以下CustomObject

    New-Object -Type PSCustomObject -Property @{
        Computername      = $_
        PowerShellVersion = $result[0]
        dotNetVersion     = $result[1]
        sqlnacli          = $result[2]
        redistributable   = $result[3]
    }

但是输出是这样的:

PowerShellVersion Computername redistributable sqlnacli dotNetVersion
----------------- ------------ --------------- -------- -------------
3+ OK             SERVERNAME     NOT OK          NOT OK   NOT OK    

为什么 PowerShell 会重新排列我的对象的顺序,如何强制它按照我想要的顺序排列?

【问题讨论】:

  • 确实是重复的,但我认为这个问题的答案质量更高,问题的标题也更笼统

标签: powershell


【解决方案1】:

哈希表没有按定义排序。如果你有 PowerShell v3.0 或更新版本,你可以为哈希表使用 [Ordered] 属性:

New-Object PSCustomObject -Property ([Ordered] @{
  Computername      = $_
  PowerShellVersion = $result[0]
  dotNetVersion     = $result[1]
  sqlnacli          = $result[2]
  redistributable   = $result[3]
})

在 PowerShell v3+ 中,您也可以只使用 [PSCustomObject] 类型加速器:

[PSCustomObject] @{
  Computername      = $_
  PowerShellVersion = $result[0]
  dotNetVersion     = $result[1]
  sqlnacli          = $result[2]
  redistributable   = $result[3]
}

如果您需要 PowerShell 版本 2 兼容性,那么您可以使用

New-Object PSObject -Property @{
  Computername      = $_
  PowerShellVersion = $result[0]
  dotNetVersion     = $result[1]
  sqlnacli          = $result[2]
  redistributable   = $result[3]
} | Select-Object Computername,PowerShellVersion,dotNetVersion,sqlnacli,redistributable

这种方法的缺点是如果你添加属性,你必须记住将它们添加到Select-Object

另一种 PowerShell v2 或更早版本是输出一些内容(例如,空字符串),然后使用 Select-Object 准确创建您想要的自定义属性:

$obj = $_
"" | Select-Object `
  @{Name = "Computername";      Expression = {$obj}},
  @{Name = "PowerShellVersion"; Expression = {$result[0]}},
  @{Name = "dotNetVersion";     Expression = {$result[1]}},
  @{Name = "sqlnacli";          Expression = {$result[2]}},
  @{Name = "redistributable";   Expression = {$result[3]}}

这里唯一的(次要)缺点是Select-Object 中的$_ 指的是前一个从中选择属性的对象(因此$obj = $_ 作为第一行,以保留值)。

【讨论】:

  • 嘿,你今天在我关于 stackexchange 的问题上到处都是 :)。谢谢,我试试
  • 在 PS3+ 中不需要 New-Object 或 [ordered],只需指定类 [PSCustomObject]@{ .... }
  • 它工作了,谢谢,@wOxxOm 你的也工作了,所以我会接受那个,因为它的代码更少。谢谢
  • 我认为首选方法是使用[PsCustomObject] 加速器,这样脚本易于阅读和遵循。
【解决方案2】:

正如@wOxxOm 和@Bill_Stewart 所提到的,您需要一个有序的哈希表来规定顺序,而默认情况下,标准哈希表不是。您可以使用 select 语句影响普通哈希表的顺序,如下所示。

New-Object -Type PSCustomObject -Property @{
    Computername      = $_
    PowerShellVersion = $result[0]
    dotNetVersion     = $result[1]
    sqlnacli          = $result[2]
    redistributable   = $result[3]
} | Select-Object Computername,PowerShellVersion,dotNetVersion,sqlnacli,redistributable

【讨论】:

  • 为了与早期版本的 Powershell 兼容,我要在这里加一个。
猜你喜欢
  • 2022-01-23
  • 2016-07-29
  • 1970-01-01
  • 2016-09-20
  • 2020-12-24
  • 2013-11-07
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多