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

PowerShell 自定义输出对象格式_第1张图片

比如说,有个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,因此输出的结果是下面这样的


如果添加一条语句

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


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

PowerShell 自定义输出对象格式_第2张图片


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






Yuan.SystemInfo

Yuan.SystemInfo






20


20










ComputerName


Manufacture


Model


OSVersion


LastBoottime








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

PowerShell 自定义输出对象格式_第3张图片


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