Ao trabalhar no console interativo, se eu definir um novo objeto e atribuir alguns valores de propriedade a ele, como este:
$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"
Então, quando eu digito o nome da minha variável na janela interativa, o Powershell me dá um resumo das propriedades e valores do objeto:
PS C:\demo> $obj
SomeProperty
------------
Test
Basicamente, quero fazer exatamente isso, mas de dentro de uma função em um script. A função cria um objeto e define alguns valores de propriedade e eu quero imprimir um resumo dos valores do objeto na janela do Powershell antes de retornar. Tentei usar Write-Host na função:
Write-Host $obj
Mas isso apenas mostra o tipo de objeto, não o resumo:
System.Object
Como posso fazer com que minha função produza um resumo dos valores de propriedade do objeto na janela do Powershell?
powershell
John
fonte
fonte
-Force
parâmetro para fazer funcionar, por exemploWrite-Host ($obj | Format-List -Force | Out-String)
...
. Eu tenho um amor e ódio com POSH$objs = @();
e$objs = $objs + $obj;
posso usarConvertTo-Html
: $ cols = $ objs | ConvertTo-Html -Fragment -Property Name, DataType, Default, Identity, InPrimaryKey, IsForeignKey, Description;Minha solução para esse problema foi usar o bloco de subexpressão $ () .
Dá:
fonte
Para imprimir as propriedades e valores do objeto no Powershell. Os exemplos abaixo funcionam bem para mim.
$ pool = Get-Item "IIS: \ AppPools.NET v4.5"
$ pool | Get-Member
$ pool | Select-Object -Property * # Você pode omitir -Property
fonte
$x | select *
, ótimo para interativo.Dica # 1
Dica # 12
-Don Jones: PowerShell Master
Idealmente, seu script criaria seus objetos (
$obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'}
) e, em seguida, apenas faria aWrite-Output $objects
. Você canalizaria a saída paraFormat-Table
.Eles realmente devem chamar PowerShell PowerObjectandPipingShell.
fonte
Never use Write-Host.
afirmação. Você não pode usar Write-Output dentro de funções que retornam dados, porque isso "poluirá" esta função. Exemplo simples. Adivinha qual função ReturnText irá gerar? É por isso que eu sempre uso funções Write-host dentro. function ReturnText () {Write-Output "Alguma mensagem aleatória" return "O que eu quero retornar"}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:Use o
-Force
.Use
ConvertTo-Json
para profundidade e "serialização" legívelEu 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 deConvertTo-Json
, o que também permite especificar a profundidade.Observe que não especificar
Depth
implica-Depth 2
E se você não planeja lê-lo, você pode
-Compress
fazê-lo (ou seja, tirar os espaços em branco)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
):Advertência para
Get-Member -InputObject
: Se $ obj for uma coleção (por exemploSystem.Object[]
), você acaba recebendo informações sobre o próprio objeto da coleção:Se você quiser
Get-Member
para cadaTypeName
na coleção (NB para cadaTypeName
, não para cada objeto - uma coleção de N objetos com todos iguaisTypeName
imprimirá apenas 1 tabela para issoTypeName
, não N tabelas para cada objeto) ...... apenas fique com a tubulação diretamente.fonte
O abaixo funcionou muito bem para mim. Eu juntei todas as respostas acima e li sobre a exibição de propriedades de objetos no link a seguir e encontrei a breve leitura abaixo sobre como imprimir objetos
adicione o seguinte texto a um arquivo denominado print_object.ps1:
Abra o prompt de comando do PowerShell, vá para o diretório onde o arquivo existe e digite o seguinte:
Basta substituir 'System.DateTime' por qualquer objeto que você deseja imprimir. Se o objeto for nulo, nada será impresso.
fonte
fonte