PowerShell 的对象有很多类型,不同的类型有不同的输出格式。这些格式定义在$pshome 下面的dotnettypes.format.ps1xml里面。这个文件是有数字签名的,因此不能修改,但是我们可以依葫芦画瓢的复制粘贴内容再修改,这样子我们可以给自己定义的对象作出不同的输出效果来。

wKioL1c1TAiTIhmcAAN9R9nT_r8908.png

比如说,有个function,如下所示

Function Get-SystemInfo{
[cmdletbinding()]
param(
[string[]]$ComputerName
)
begin{}
process{
$result=@()
foreach($computer in $ComputerName){
try{
write-verbose "Querying OS and Computer System"
$os=Get-WmiObject -Class win32_operatingsystem -ErrorAction Stop 
$cs=Get-WmiObject -Class win32_computersystem -ErrorAction Stop
}catch{
$computer |out-file c:\temp\error.txt -Append
}
$prop=@{ComputerName=$computer;LastBootTime=$os.ConvertToDateTime($os.LastBootUpTime);OSVersion=$os.Version;Manufacture=$cs.Manufacturer;Model=$cs.model}
$obj=New-Object -TypeName psobject -property $prop
#$obj.psobject.typenames.insert(0,'Yuan.systeminfo')
write-output $obj 
}
}
end {}
}
Get-SystemInfo -ComputerName "localhost"


默认的输出类型是 pscustomobject,因此输出的结果是下面这样的

wKioL1c1S3GRhXgfAACs3EPTu1k399.png


如果添加一条语句

$obj.psobject.typenames.insert(0,'Yuan.systeminfo')


这个时候如果查看 $obj | gm 的属性,可以看见他的类型变成我自定义的 yuan.systeminfo了

wKiom1c1TE_gPeNiAAFusejyR6g276.png


接下来我们来创建一个 test.format.ps1xml 文件,在这个文件里面自定义yuan.systeminfo的格式。如下所示。下面基本上是拷贝table 的格式,只不过把对应显示的名字和属性改成我自己对象的内容。


<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
<ViewDefinitions>
<View>
<Name>Yuan.SystemInfo</Name>
<ViewSelectedBy>
<TypeName>Yuan.SystemInfo</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader/>
<TableColumnHeader>
<Label>Manufacturer</Label>
<Width>20</Width>
</TableColumnHeader>
<TableColumnHeader>
<Width>20</Width>
</TableColumnHeader>
<TableColumnHeader/>
<TableColumnHeader>
<Label>LastBootTime</Label>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>ComputerName</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Manufacture</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Model</PropertyName>
</TableColumnItem>
<TableColumnItem>
<Propertyname>OSVersion</Propertyname>
</TableColumnItem>
<TableColumnItem>
<Propertyname>LastBoottime</Propertyname>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
</ViewDefinitions>
</Configuration>


修改之后更新数据格式,再运行程序,发现成功更改了!

wKiom1c1SpLROEOzAAETh-PMWsU148.png


参考资料:《Learn PowerShell Toolmaking in a month of Lunch》