在Powershell v3中,有没有办法设置要扩展的自定义对象的默认显示属性?

时间:2016-08-30 22:51:40

标签: powershell powershell-v3.0

我在从数据库中检索的自定义对象中有一组基本属性。它看起来像这样:

> $baseObject | Format-List


Id       : 199fc2fb-249e-40f8-8d52-ab05b38b5473
BaseType : container
Format   : Employee Listing
QueryUrl : https://datacenter/api/v1/employees.json?id=199fc2fb-249e-40f8-8d52-ab05b38b5473

当我在Invoke-RestMethod$baseObject.QueryUrl时,它会返回相同的数据,并添加一个包含员工列表的新成员。结果类似于以下内容:

> $employeeObject = Invoke-RestMethod -Uri $baseObject.QueryUrl

> $employeeObject

Id              : 199fc2fb-249e-40f8-8d52-ab05b38b5473
BaseType        : container
Format          : Employee Listing
QueryUrl        : https://datacenter/api/v1/employees.json?id=199fc2fb-249e-40f8-8d52-ab05b38b5473
EmployeeListing : {@{Name=Keanu Reeves; Age=51; Specialty=Security}, @{Name=Morgan Freeman; Age=79; Specialty=Fixed Operations}, @{Name=Miyuki
              Miyazaki; Age=37; Specialty=Executive}}

为了以格式化方式查看此信息,用户必须运行以下命令:

> $employeeObject | Select -Expand EmployeeListing

Name            Age Specialty
----            --- ---------
Keanu Reeves     51 Security
Morgan Freeman   79 Fixed Operations
Miyuki Miyazaki  37 Executive

我在其他地方使用DefaultDisplayPropertySetas demonstrated here)来实现它,因此自定义对象在表格中很好地格式化。在这种情况下,我对EmployeeListing也这样做。

我遇到的问题是我有脚本会查询多个$baseObject.QueryUrl值,操纵所有结果中的数据,并将结果显示给用户。一些查询URL仅返回一个EmployeeListing条目,尽管其中大多数返回许多。就像现在一样,不可能产生好的输出格式。如果不将DefaultDisplayPropertySet设置为EmployeeListing,结果就会显示如下:

> Get-AllEmployees

Id              : 199fc2fb-249e-40f8-8d52-ab05b38b5473
BaseType        : container
Format          : Employee Listing
QueryUrl        : https://datacenter/api/v1/employees.json?id=199fc2fb-249e-40f8-8d52-ab05b38b5473
EmployeeListing : {@{Name=Keanu Reeves; Age=51; Specialty=Security}, @{Name=Morgan Freeman; Age=79; Specialty=Fixed Operations}, @{Name=Miyuki
                  Miyazaki; Age=37; Specialty=Executive}}

Id              : 6444128f-a179-4081-a123-d54b3460fa25
BaseType        : container
Format          : Employee Listing
QueryUrl        : https://datacenter/api/v1/employees.json?id=6444128f-a179-4081-a123-d54b3460fa25
EmployeeListing : {@{Name=Jason Bourne; Age=42; Specialty=Security}, @{Name=Anton Chigurh; Age=55; Specialty=Sales}, @{Name=Patrick Bateman; Age=27;
                  Specialty=Mergers & Acquisitions}}

即使我将DefaultDisplayPropertySet设置为仅显示EmployeeListing,它也始终显示每个结果对象的哈希表格式

> Get-AllEmployees

EmployeeListing
---------------
{@{Name=Keanu Reeves; Age=51; Specialty=Security}, @{Name=Morgan Freeman; Age=79; Specialty=Fixed Operations}, @{Name=Miyuki Miyazaki; Age=37; Spe...
{@{Name=Jason Bourne; Age=42; Specialty=Security}, @{Name=Anton Chigurh; Age=55; Specialty=Sales}, @{Name=Patrick Bateman; Age=27; Specialty=Merge...

我希望它们显示为表格。我可以通过将所有这些查询的结果汇总到Select -Expand EmployeeListing来轻松解决这个问题,因为每个列表都是从Get-AllEmployees中的管道返回的。但是,其他值必须出现在返回的对象中IdBaseTypeFormat等等。)即使它们也是如此没有显示。这是因为还有其他脚本和程序希望对象以这种方式包含数据(这就是我正在调用的API返回它们的原因。)

实质上,这个是我想要完成的事情:

> Get-AllEmployees

Name            Age Specialty
----            --- ---------
Keanu Reeves     51 Security
Morgan Freeman   79 Fixed Operations
Miyuki Miyazaki  37 Executive
Jason Bourne     42 Security
Anton Chigurh    55 Sales
Patrick Bateman  27 Mergers & Acquisitions



> Get-AllEmployees | Format-List -Property *

Id              : 199fc2fb-249e-40f8-8d52-ab05b38b5473
BaseType        : container
Format          : Employee Listing
QueryUrl        : https://datacenter/api/v1/employees.json?id=199fc2fb-249e-40f8-8d52-ab05b38b5473
EmployeeListing : {@{Name=Keanu Reeves; Age=51; Specialty=Security}, @{Name=Morgan Freeman; Age=79; Specialty=Fixed Operations}, @{Name=Miyuki
                  Miyazaki; Age=37; Specialty=Executive}}

Id              : 6444128f-a179-4081-a123-d54b3460fa25
BaseType        : container
Format          : Employee Listing
QueryUrl        : https://datacenter/api/v1/employees.json?id=6444128f-a179-4081-a123-d54b3460fa25
EmployeeListing : {@{Name=Jason Bourne; Age=42; Specialty=Security}, @{Name=Anton Chigurh; Age=55; Specialty=Sales}, @{Name=Patrick Bateman; Age=27;
                  Specialty=Mergers & Acquisitions}}

这可能吗?

对于它的价值,这是一个问题(我相信)可能通过使用Powershell v5及其功能更丰富的类/类型系统来解决,但遗憾的是,我已经锁定了v3。

更新:还没有,但我似乎越来越近。

在阅读Trevor Sullivan链接中提供的MSDN文档之后,我编写了一个simple object display formatting module,因此我可以动态地向对象提供格式数据,而不必为每种可能的类型编写.ps1xml文件。 (它还不是非常高效,但它暂时可以替代它。)我的Get-AllEmployees脚本现在看起来像这样:

...
$allListings = Get-AllQueryUrls -Format "Employee Listing"
foreach ($employeeListing in $allListings)
{
  $result = $employeeListing
  $result | Set-ObjectDisplayFormat -TypeName "EmployeeListingRecord" -Property @{N="Name"; E={$_.EmployeeListing.Name}},@{N="Age"; E={$_.EmployeeListing.Age}},@{N="Specialty"; E={$_.EmployeeListing.Specialty}}
  $result
}

现在,当我执行Get-AllEmployees时,输出如下所示:

> Get-AllEmployees

Name                                            Age          Specialty
----                                            ---          ---------
{Keanu Reeves, Morgan Freeman, Miyuki Miyazaki} {51, 79, 37} {Security, Fixed Operations, Executive}
{Jason Bourne, Anton Chigurh, Patrick Bateman}  {42, 55, 27} {Security, Sales, Mergers & Acquisitions}

我认为这是进步,但是是正确的,所以我仍在寻找答案。

0 个答案:

没有答案