自定义 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>
元素以反映命名空间限定的类型名称。
我有一个 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>
元素以反映命名空间限定的类型名称。