更改对象中列的顺序

时间:2013-10-27 22:51:01

标签: powershell

如何更改我的代码产生的输出的列顺序:

$apps = Import-CSV apps.csv
$computers = Import-CSV compobj.csv
foreach ($computer in $computers) {    
    $computerLob = $computer.lob
    $lobApps = $apps | ? {$_.lob -eq $computerLob }
    foreach ($app in $lobApps) {
        $computerHostname = $computer.hostname
        $appLocation = $app.location
        $installed=Test-Path "\\$computerHostname\$appLocation"      
        New-Object PSObject -Property @{
            Computer=$computer.hostname
            App=$app.appname
            Installed=$installed
        }
    }

目前,它按以下顺序生成列:Installed,App,Computer

我希望按以下顺序排列:Computer,App,Installed

5 个答案:

答案 0 :(得分:12)

Powershell V3为[PSCustomObject]添加了一个类型加速器,它使用有序哈希表创建对象,因此属性保持按照它们声明的顺序:

[PSCustomObject] @{
  Computer=$computer.hostname
  App=$app.appname
  Installed=$installed
}

答案 1 :(得分:10)

如果要确保对象的输出按特定顺序发生,即以某种方式格式化,则使用PowerShell的格式化命令。

$obj = [pscustomobject]@{Computer=$computer.hostname;App=$app.appname;Installed=$installed} 
$obj | Format-Table Computer,App,Installed

你还可以更好地控制输出,例如:

$obj | Format-Table Computer,App,Installed -AutoSize

或控制场宽&对准:

$obj | Format-Table @{label='Computer';expression={$_.Computer};width=20;alignment='right'},App,Installed

坦率地说,我认为使用格式化命令获取所需的输出顺序是一种更好的做法,而不是依赖于创建属性的顺序。

答案 2 :(得分:4)

问题是您使用哈希表添加属性,哈希表不保留顺序。你可以做以下两件事之一:

1。以设置顺序的方式添加属性(最后一行是将对象输出到管道):

$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $computer.hostname
$obj | Add-Member -MemberType NoteProperty -Name App -Value $app.appname
$obj | Add-Member -MemberType NoteProperty -Name Installed -Value $installed
$obj

2。使用选择对象确定将对象输出到管道时的顺序:

New-Object PSObject -Property @{
  Computer=$computer.hostname
  App=$app.appname
  Installed=$installed
} | select Computer,App,Installed

哪一个更可取决于您将使用该对象的程度。如果你的问题暗示,你只是使用PSObject以表格形式显示信息,那么第二种方法更快。如果您要在脚本的不同部分多次输出对象,则第一种方法允许您只需将其输出为$obj,而不必每次都输入选择

另请注意,如果您不想在填充对象后立即输出对象,则可以将此方法拆分为:

$obj = New-Object PSObject -Property @{
   Computer=$computer.hostname
    App=$app.appname
    Installed=$installed
} 

[...do other stuff...]

$obj | select Computer,App,Installed

答案 3 :(得分:2)

Format-Table当您需要以特定顺序显示您的对象字段时,它是一个很好的解决方案,但它会改变对象并且您无法胜任管道对象,例如导出到csv(Export-Csv)。

如果您只想更改"对象中字段的顺序"使用Select-Object。这将保留对象类型和字段,您仍然可以将对象传递给其他cmdlet。

答案 4 :(得分:0)

一种更通用的更改顺序的方法是使用 Select-Object cmdlet,其中包含按所需顺序排列的属性列表。

看例子:

PS> $ObjectList = 1..3 | 
% {New-Object psobject -Property @{P2="Object $_ property P2"; P1="Object $_ property P1"}}
PS> $ObjectList

P2                   P1
--                   --
Object 1 property P2 Object 1 property P1
Object 2 property P2 Object 2 property P1
Object 3 property P2 Object 3 property P1


PS> $ObjectList | Select-Object P1,P2

P1                   P2
--                   --
Object 1 property P1 Object 1 property P2
Object 2 property P1 Object 2 property P2
Object 3 property P1 Object 3 property P2

这些命令的完整形式如下:

$ObjectList = 1..3 | 
ForEach-Object -Process {New-Object -TypeName psobject -Property @{P2="Object $_ property P2"; P1="Object $_ property P1"}}
$ObjectList | Select-Object -Property P1,P2