我有时希望对象的默认输出包含一个我认为有用的附加属性。
例如:
$x = ps - ComputerName server1 | select -First 1
$x | fl
Id : 880
Handles : 397
CPU :
Name : acnamagent
如果我想显示所有这些属性+ MachineName属性怎么办?
$x | select Id,Handles,CPU,Name,MachineName
Id : 880
Handles : 397
CPU :
Name : acnamagent
MachineName : server1
这有效,但我不想明确地命名所有这些默认属性。
我尝试使用PSStandardMembers.DefaultDisplayPropertySet.ReferencedPropertyNames,但我无法使用它。
这可以轻松完成吗?
答案 0 :(得分:2)
嗯,这取决于你所定义的“容易”。 PowerShell使用XML配置cmdlet的输出(C:\ windows \ systems32 \ windowspowershell \ v1.0 \ DotNetTypes.format.ps1xml)。您创建另一个xml文件(您无法更改默认文件)C:\ windows \ systems32 \ windowspowershell \ v1.0 \ Types.ps1xml。 about_Types.ps1XML
咨询:http://codingbee.net/tutorials/powershell/powershell-changing-a-command-outputs-default-formatting/
编辑:您需要为该任务创建新的PropertySet。请参考以下链接:
https://github.com/DBremen/PowerShellScripts/blob/master/functions/Add-PropertySet.ps1
https://powershellone.wordpress.com/2015/03/06/powershell-propertysets-and-format-views/
在您创建它之后,您可以这样称呼它:
gps | select mypropertyset
答案 1 :(得分:0)
我最终创建了以下函数来完全按照我想要的方式执行:
<#
.Synopsis
Selects all default properties plus those specified.
.DESCRIPTION
In case no default properties exist, all are selected
#>
function Select-DefaultPropsPlus {
[CmdletBinding()]
[OutputType([PSObject])]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[PSObject] $InputObject,
[Parameter(Mandatory = $true, Position = 1)]
[ValidateNotNullOrEmpty()]
[string[]] $Property
)
Process {
$selectedProperties = @()
if (($InputObject | Get-Member -Force).Name -contains "PSStandardMembers") {
$selectedProperties = $InputObject.PSStandardMembers.DefaultDisplayPropertySet.ReferencedPropertyNames + $Property
} else {
$selectedProperties = *
}
$InputObject | Select-Object -Property $selectedProperties
}
}