自定义PowerShell对象输出

时间:2015-01-01 13:50:54

标签: c# powershell

我有一个C#类:

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

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

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

$o = Get-SomeObject
$o

PowerShell会提示SomeObject属性的值,这意味着:

id = 5
displayName = Pikachu

有没有让PowerShell调用该对象的ToString()方法,所以“Hello”会打印到控制台上吗?

1 个答案:

答案 0 :(得分:3)

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

此外,您不应该在ToString()中写入控制台。你的ToString()方法应该只返回一个字符串。顺便说一句,您还可以通过将对象转换为[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>元素,以反映命名空间限定类型名称。