如何更改我的代码产生的输出的列顺序:
$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
。
答案 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