一些一般说明。
$obj | Select-Object
⊆ $obj | Select-Object -Property *
后者将显示所有非内部的,非编译器生成的属性。前者似乎并没有(总是)显示所有的 Property类型(在我的测试中,它的确显示出了CodeProperty
MemberType
一致的状态-此处没有保证)。
Get-Member
并没有在默认情况下得到的静态成员。您也不能(直接)使它们与非静态成员在一起。也就是说,使用开关将仅返回静态成员:
PS Y:\Power> $obj | Get-Member -Static
TypeName: System.IsFire.TurnUpProtocol
Name MemberType Definition
---- ---------- ----------
Equals Method static bool Equals(System.Object objA, System.Object objB)
...
使用-Force
。
该Get-Member
命令使用Force参数将对象的固有成员和编译器生成的成员添加到显示中。Get-Member
获取这些成员,但默认情况下将其隐藏。
PS Y:\Power> $obj | Get-Member -Static
TypeName: System.IsFire.TurnUpProtocol
Name MemberType Definition
---- ---------- ----------
...
pstypenames CodeProperty System.Collections.ObjectModel.Collection...
psadapted MemberSet psadapted {AccessRightType, AccessRuleType,...
...
使用ConvertTo-Json
深度和可读性“系列化”
我没有必要建议使用JSON保存对象(Export-Clixml
改为使用)。但是,您可以从中获得或多或少可读的输出ConvertTo-Json
,这也允许您指定深度。
请注意,未指定Depth
暗示-Depth 2
PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
"AllowSystemOverload": true,
"AllowLifeToGetInTheWay": false,
"CantAnyMore": true,
"LastResortOnly": true,
...
而且,如果您不打算阅读,也可以-Compress
(例如,带空格)
PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress
-InputObject
如果可以(并愿意)使用,请使用
使用PowerShell的99.9%的时间:性能无关紧要,或者您不在乎性能。但是,应注意的是,在不需要管道时避免使用管道可以节省一些开销并增加一些速度(通常,管道不是超级有效的)。
就是说,如果您拥有的全部都可以$obj
方便地进行打印(并且有时不会像我这样懒惰地输入-InputObject
):
# select is aliased (hardcoded) to Select-Object
PS Y:\Power> select -Property * -InputObject $obj
# gm is aliased (hardcoded) to Get-Member
PS Y:\Power> gm -Force -InputObject $obj
警告Get-Member -InputObject
:
如果$ obj是一个集合(例如System.Object[]
),您最终将获得有关集合对象本身的信息:
PS Y:\Power> gm -InputObject $obj,$obj2
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
如果你想Get-Member
为每个TypeName
集合中(NB每个TypeName
,不是每个对象- N的集合与所有相同的对象TypeName
将只打印1代表为TypeName
,不为N表为每个对象)......只需坚持用管道将其直接插入即可。
-Force
参数才能使其正常工作,例如Write-Host ($obj | Format-List -Force | Out-String)