Algumas notas gerais.
$obj | Select-Object
⊆ $obj | Select-Object -Property *
O último mostrará todas as propriedades não intrínsecas e não geradas pelo compilador. O primeiro não parece (sempre) mostrar todos os tipos de propriedade (em meus testes, ele parece mostrar CodeProperty
MemberType
consistentemente - sem garantias aqui).
Algumas opções a serem observadas para Get-Member
Get-Member
se não conseguir membros estáticos por padrão. Você também não pode obtê-los (diretamente) junto com os membros não estáticos. Ou seja, usar a opção faz com que apenas membros estáticos sejam retornados:
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)
...
Use o -Force
.
O Get-Member
comando usa o parâmetro Force para adicionar à exibição os membros intrínsecos e os membros gerados pelo compilador dos objetos. Get-Member
obtém esses membros, mas os oculta por padrão.
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,...
...
Use ConvertTo-Json
para profundidade e "serialização" legível
Eu não recomendo necessariamente salvar objetos usando JSON (use em Export-Clixml
vez disso). No entanto, você pode obter uma saída mais ou menos legível de ConvertTo-Json
, o que também permite especificar a profundidade.
Observe que não especificar Depth
implica-Depth 2
PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
"AllowSystemOverload": true,
"AllowLifeToGetInTheWay": false,
"CantAnyMore": true,
"LastResortOnly": true,
...
E se você não planeja lê-lo, você pode -Compress
fazê-lo (ou seja, tirar os espaços em branco)
PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress
Use -InputObject
se puder (e estiver disposto)
99,9% do tempo ao usar o PowerShell: ou o desempenho não importa ou você não se preocupa com o desempenho. Contudo , deve-se notar que evitar o cano quando você não precisa dele pode economizar alguma sobrecarga e adicionar alguma velocidade (a tubulação, em geral, não é supereficiente).
Ou seja, se tudo o que você tem é um único $obj
útil para imprimir (e não é tão preguiçoso como eu às vezes para digitar -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
Advertência para Get-Member -InputObject
:
Se $ obj for uma coleção (por exemplo System.Object[]
), você acaba recebendo informações sobre o próprio objeto da coleção:
PS Y:\Power> gm -InputObject $obj,$obj2
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
Se você quiser Get-Member
para cada TypeName
na coleção (NB para cada TypeName
, não para cada objeto - uma coleção de N objetos com todos iguais TypeName
imprimirá apenas 1 tabela para isso TypeName
, não N tabelas para cada objeto) ...... apenas fique com a tubulação diretamente.
-Force
parâmetro para fazer funcionar, por exemploWrite-Host ($obj | Format-List -Force | Out-String)