自定义 PowerShell 对象输出

Customize PowerShell object output

我有一个 C# 类:

class SomeObject
{
    int id;
    string displayName;
    // And so on..

   public override string ToString()
   {
       return "Hello";
   }
}

我有一个命令,Get-SomeObject returns SomeObject 的一个实例。 但是,如果我这样做:

$o = Get-SomeObject
$o

PowerShell 提示 SomeObject 属性的值,意思是:

id = 5
displayName = Pikachu

是否可以让 PowerShell 调用该对象的 ToString() 方法,从而将 "Hello" 打印到控制台?

默认情况下,PowerShell 将为没有格式信息的对象显示 属性 值。对于四个或更少的属性,使用 table 格式。对于五个或更多属性,使用列表格式。如果您想控制对象的显示方式,您应该通过 Update-FormatData 添加格式化数据。请参阅有关 Update-FormatData 和 about_Format.ps1xml 的手册页。

此外,您不应在 ToString() 中写入控制台。您的 ToString() 方法应该只是 return 一个字符串。顺便说一句,您还可以通过将对象转换为 [string] 来让 PowerShell 调用 ToString() 例如:

PS C:\> Add-Type -TypeDefinition @'
>>> public class SomeObject
>>> {
>>>     public int Id {get; set;}
>>>     public string DisplayName {get; set;}
>>>     // And so on..
>>>
>>>    public override string ToString()
>>>    {
>>>        return "Hello";
>>>    }
>>> }
>>> '@

PS C:\> $o = New-Object SomeObject
PS C:\> [string]$o
Hello

如果你想遵循格式数据路线,这里有一个如何做到这一点的例子:

PS C:\> @'
>>> <Configuration>
>>>   <ViewDefinitions>
>>>     <View>
>>>       <Name>SomeObject</Name>
>>>       <ViewSelectedBy>
>>>          <TypeName>SomeObject</TypeName>
>>>       </ViewSelectedBy>
>>>       <TableControl>
>>>         <TableHeaders>
>>>           <TableColumnHeader>
>>>             <Label>SomeObject</Label>
>>>           </TableColumnHeader>
>>>         </TableHeaders>
>>>         <TableRowEntries>
>>>           <TableRowEntry>
>>>             <TableColumnItems>
>>>               <TableColumnItem>
>>>                 <ScriptBlock>$_.ToString()</ScriptBlock>
>>>               </TableColumnItem>
>>>             </TableColumnItems>
>>>           </TableRowEntry>
>>>          </TableRowEntries>
>>>       </TableControl>
>>>     </View>
>>>   </ViewDefinitions>
>>> </Configuration>
>>> '@ > SomeObject.format.ps1xml

PS C:\> Update-FormatData .\SomeObject.format.ps1xml
PS C:\> $o

SomeObject
----------
Hello

如果您的 SomeObject 类型在命名空间中,请务必更新上述格式数据中的 <TypeName> 元素以反映命名空间限定的类型名称。