9

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

$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.

4

5 回答 5

18

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

[PSCustomObject] @{
  Computer=$computer.hostname
  App=$app.appname
  Installed=$installed
}
于 2013-10-27T23:48:31.477 回答
17

如果要确保对象的输出以特定顺序发生,即以特定方式格式化,则使用 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

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

于 2013-10-28T03:53:53.270 回答
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

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

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
于 2013-10-27T23:29:45.453 回答
5

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

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

于 2014-07-31T07:26:38.220 回答
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
于 2021-01-04T15:28:25.093 回答