2017-02-17 45 views
4

我建立我的功能爲什麼powershell重新排列我的輸出?

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

以下CustomObject但輸出是這樣的:

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

爲什麼PowerShell的重新安排我的對象的順序,我怎麼能強迫它以訂單我想要它?

+0

它是一個重複的確,但我認爲這個問題的答案是更高質量的,也是問題的標題是更普遍的 – SimonS

回答

7

根據定義不排序散列表。如果您有PowerShell的3.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 = $_作爲第一行以保留該值)。

+0

哎,你今天是所有在我的問題上stackexchange :) 。謝謝,我會嘗試 – SimonS

+3

在PS3 +不需要新對象或[有序],只需指定類[[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