更改对象中列的顺序

the*_*izy 3 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我希望按以下顺序进行:Computer,App,Installed.

Kei*_*ill 13

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

$obj = [pscustomobject]@{Computer=$computer.hostname;App=$app.appname;Installed=$installed} 
$obj | Format-Table Computer,App,Installed
Run Code Online (Sandbox Code Playgroud)

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

$obj | Format-Table Computer,App,Installed -AutoSize
Run Code Online (Sandbox Code Playgroud)

或控制字段宽度和对齐:

$obj | Format-Table @{label='Computer';expression={$_.Computer};width=20;alignment='right'},App,Installed
Run Code Online (Sandbox Code Playgroud)

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


mjo*_*nor 12

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

[PSCustomObject] @{
  Computer=$computer.hostname
  App=$app.appname
  Installed=$installed
}
Run Code Online (Sandbox Code Playgroud)


Adi*_*bar 5

问题是您使用哈希表添加属性,而哈希表不保留顺序。您可以执行以下两项操作之一:

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
Run Code Online (Sandbox Code Playgroud)

2.使用Select-Object确定将对象输出到管道时的顺序:

New-Object PSObject -Property @{
  Computer=$computer.hostname
  App=$app.appname
  Installed=$installed
} | select Computer,App,Installed
Run Code Online (Sandbox Code Playgroud)

哪个更可取取决于您将使用多少对象。如果正如您的问题所暗示的那样,您仅使用 PSObject 来以表格格式显示信息,则第二种方法更快。如果您要在脚本的不同部分多次输出对象,第一种方法允许您简单地将其输出为,$obj而不必每次都通过管道进行选择

另请注意,如果您不想在填充对象后立即输出对象,则可以像这样拆分第二种方法:

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

[...do other stuff...]

$obj | select Computer,App,Installed
Run Code Online (Sandbox Code Playgroud)


Emi*_*ggi 5

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

如果您只想更改“对象中字段的顺序”,请使用Select-Object. 这将保留对象类型和字段,并且您仍然可以将对象通过管道传输到其他 cmdlet。