2017-02-17 4 views
4

я строю следующий CustomObject в моей функцииПочему powershell меняет свой результат?

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 изменить порядок моего объекта, и как я могу заставить его принять заказ Я хочу этого?

+0

дублирует действительно, но я думаю, что ответ на этот вопрос более высокого качества, а также название вопроса является более общим – SimonS

ответ

7

Hashtables не упорядочены по определению. Если у вас есть PowerShell v3.0 или более поздней версии, вы можете использовать атрибут [Ordered] для Hashtable:

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 = $_ в качестве первой строки, чтобы сохранить значение).

+0

эй, вы все вокруг моих вопросов на stackexchange сегодня :) , спасибо, я попробую – SimonS

+3

В PS3 + нет необходимости в New-Object или [ordered], просто укажите класс '[PSCustomObject] @ {....}' – wOxxOm

+0

, он работал, спасибо, @wOxxOm ваш тоже работал, поэтому я ' Я возьму это, потому что это меньше кода. спасибо – SimonS

3

Как @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 
+0

Я собираюсь сказать плюс один здесь для совместимости с более ранними ароматами Powershell. – user4317867

 Смежные вопросы

  • Нет связанных вопросов^_^