我在从数据库中检索的自定义对象中有一组基本属性。它看起来像这样:
> $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
我在其他地方使用DefaultDisplayPropertySet
(as 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
中的管道返回的。但是,其他值必须出现在返回的对象中(Id
,BaseType
,Format
等等。)即使它们也是如此没有显示。这是因为还有其他脚本和程序希望对象以这种方式包含数据(这就是我正在调用的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}
我认为这是进步,但是远是正确的,所以我仍在寻找答案。