2017-02-17 4 views
4

ich bauen die folgende CustomObject in meiner FunktionWarum ändert Powershell meine Ausgabe?

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

Aber der Ausgang ist wie folgt:

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

warum Powershell die Reihenfolge meiner Objekt neu anordnen und wie kann ich sie zwingen, um den Auftrag zu übernehmen Ich will es?

+0

es ist ein Duplikat in der Tat, aber ich denke, die Antwort auf diese Frage von höherer Qualität ist auch der Titel der Frage ist allgemeiner – SimonS

Antwort

7

Hashtables sind nicht per Definition sortiert. Wenn Sie Powershell v3.0 oder höher haben, können Sie das [Ordered] Attribut für die Hash-Tabelle verwenden:

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

In Powershell v3 + Sie können auch einfach die [PSCustomObject] Beschleuniger:

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

Wenn Sie brauchen Powershell-Version 2 Kompatibilität, dann können Sie

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

Der Nachteil bei dieser Methode verwenden, wenn Sie Eigenschaften hinzufügen, müssen Sie daran denken t hinzufügen Saum zu Select-Object.

Eine Alternative Powershell v2 oder älter ist zur Ausgabe von etwas (zB eine leere Zeichenkette) und Select-Object dann Eigenschaften genau die benutzerdefinierten erstellen verwenden Sie wollen:

$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]} 

Der einzige (kleine) hier Nachteil ist, dass $_ in Select-Object bezieht sich auf das unmittelbar vorausgehende Objekt, aus dem Eigenschaften ausgewählt werden (daher die $obj = $_ als erste Zeile, um den Wert zu erhalten).

+0

hey, Sie alle um meine Fragen zu Stack heute sind :) . Danke, ich werde versuchen – SimonS

+3

In PS3 + keine Notwendigkeit für New-Object oder [georderten], einfach die Klasse angeben [PSCustomObject] @ {....} ' – wOxxOm

+0

es funktioniert danke, @wOxxOm deins arbeitete auch, so dass ich ' Ich nehme das, weil es weniger Code ist. danke – SimonS

3

Wie @wOxxOm und @Bill_Stewart erwähnt haben, benötigen Sie eine geordnete Hashtabelle, um die Reihenfolge zu diktieren, und standardmäßige Hashtabellen sind dies nicht. Sie können die Reihenfolge einer normalen Hashtabelle mit einer Select-Anweisung wie dieser beeinflussen.

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

Ich werde hier plus eins sagen für die Kompatibilität mit früheren Geschmacksrichtungen von Powershell. – user4317867