Algunas notas generales.
$obj | Select-Object
⊆ $obj | Select-Object -Property *
Este último mostrará todas las propiedades no intrínsecas y no generadas por el compilador. El primero no parece (siempre) mostrar todos los tipos de propiedad (en mis pruebas, parece mostrar la CodeProperty
MemberType
coherencia, aunque no hay garantías aquí).
Algunos cambios a tener en cuenta para Get-Member
Get-Member
no no conseguir que los miembros estáticos de forma predeterminada. Tampoco puede (directamente) llevarlos junto con los miembros no estáticos. Es decir, el uso del conmutador hace que solo se devuelvan miembros estáticos:
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)
...
Utilice el -Force
.
El Get-Member
comando usa el parámetro Force para agregar los miembros intrínsecos y los miembros generados por el compilador de los objetos a la pantalla. Get-Member
obtiene estos miembros, pero los oculta de forma predeterminada.
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,...
...
Úselo ConvertTo-Json
para una "serialización" legible y profunda
Yo no necesarias objetos recomiendan ahorrar utilizando JSON (uso Export-Clixml
en su lugar). Sin embargo, puede obtener una salida más o menos legible de ConvertTo-Json
, que también le permite especificar la profundidad.
Tenga en cuenta que no especificar Depth
implica-Depth 2
PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
"AllowSystemOverload": true,
"AllowLifeToGetInTheWay": false,
"CantAnyMore": true,
"LastResortOnly": true,
...
Y si no planea leerlo, puede -Compress
hacerlo (es decir, quitar los espacios en blanco)
PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress
Úselo -InputObject
si puede (y está dispuesto)
El 99,9% de las veces cuando se usa PowerShell: o el rendimiento no importará o no le importa el rendimiento. Sin embargo , debe tenerse en cuenta que evitar la tubería cuando no la necesita puede ahorrar algunos gastos generales y agregar algo de velocidad (la tubería, en general, no es muy eficiente).
Es decir, si todo lo que tiene es un solo $obj
útil para imprimir (y no es tan vago como yo a veces para escribir -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
Advertencia para Get-Member -InputObject
:
si $ obj es una colección (por ejemplo System.Object[]
), terminará obteniendo información sobre el objeto de la colección en sí:
PS Y:\Power> gm -InputObject $obj,$obj2
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
Si lo desea Get-Member
para cada uno TypeName
en la colección (NB para cada uno TypeName
, no para cada objeto, una colección de N objetos con todos los mismos TypeName
solo imprimirá 1 tabla para eso TypeName
, no N tablas para cada objeto) ... solo quédate con la tubería directamente.
-Force
parámetro para que funcione, por ejemploWrite-Host ($obj | Format-List -Force | Out-String)