Cuando trabajo en la consola interactiva si defino un nuevo objeto y le asigno algunos valores de propiedad como este:
$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"
Luego, cuando escribo el nombre de mi variable en la ventana interactiva, Powershell me da un resumen de las propiedades y valores del objeto:
PS C:\demo> $obj
SomeProperty
------------
Test
Básicamente, quiero hacer solo esto, pero desde una función en un script. La función crea un objeto y establece algunos valores de propiedad y quiero que imprima un resumen de los valores del objeto en la ventana de Powershell antes de regresar. Intenté usar Write-Host dentro de la función:
Write-Host $obj
Pero esto solo genera el tipo de objeto, no el resumen:
System.Object
¿Cómo puedo hacer que mi función genere un resumen de los valores de propiedad del objeto en la ventana de Powershell?
powershell
Juan
fuente
fuente
-Force
parámetro para que funcione, por ejemploWrite-Host ($obj | Format-List -Force | Out-String)
...
. Tengo un amor y odio con POSH$objs = @();
y$objs = $objs + $obj;
puedo usarConvertTo-Html
: $ cols = $ objs | ConvertTo-Html -Fragment -Property Name, DataType, Default, Identity, InPrimaryKey, IsForeignKey, Description;Mi solución a este problema fue usar el bloque de subexpresión $ () .
Da:
fuente
Para imprimir las propiedades y los valores del objeto en Powershell. Los siguientes ejemplos funcionan bien para mí.
$ pool = Obtener el elemento "IIS: \ AppPools.NET v4.5"
$ piscina | Obtener miembro
$ piscina | Seleccionar-Objeto -Propiedad * # Puede omitir -Propiedad
fuente
$x | select *
, ideal para interactivos.Consejo # 1
Consejo # 12
-Don Jones: Maestro de PowerShell
Idealmente, su secuencia de comandos crearía sus objetos (
$obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'}
) y luego simplemente haría un archivoWrite-Output $objects
. Canalizaría la salida aFormat-Table
.Realmente deberían llamar a PowerShell PowerObjectandPipingShell.
fuente
Never use Write-Host.
declaración. No puede usar Write-Output dentro de funciones que devuelven datos, porque "contaminarán" esta función. Ejemplo sencillo. ¿Adivina qué generará la función ReturnText? Es por eso que siempre uso las funciones internas Write-host. function ReturnText () {Write-Output "Algún mensaje aleatorio" return "Lo que quiero devolver"}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:Utilice el
-Force
.Úselo
ConvertTo-Json
para una "serialización" legible y profundaYo no necesarias objetos recomiendan ahorrar utilizando JSON (uso
Export-Clixml
en su lugar). Sin embargo, puede obtener una salida más o menos legible deConvertTo-Json
, que también le permite especificar la profundidad.Tenga en cuenta que no especificar
Depth
implica-Depth 2
Y si no planea leerlo, puede
-Compress
hacerlo (es decir, quitar los espacios en blanco)Ú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
):Advertencia para
Get-Member -InputObject
: si $ obj es una colección (por ejemploSystem.Object[]
), terminará obteniendo información sobre el objeto de la colección en sí:Si lo desea
Get-Member
para cada unoTypeName
en la colección (NB para cada unoTypeName
, no para cada objeto, una colección de N objetos con todos los mismosTypeName
solo imprimirá 1 tabla para esoTypeName
, no N tablas para cada objeto) ... solo quédate con la tubería directamente.fuente
Lo siguiente funcionó muy bien para mí. Parcheé todas las respuestas anteriores y leí sobre cómo mostrar las propiedades de los objetos en el siguiente enlace y obtuve la siguiente lectura breve sobre la impresión de objetos.
agregue el siguiente texto a un archivo llamado print_object.ps1:
Abra el símbolo del sistema de PowerShell, vaya al directorio donde existe ese archivo y escriba lo siguiente:
Simplemente sustituya 'System.DateTime' con cualquier objeto que desee imprimir. Si el objeto es nulo, no se imprimirá nada.
fuente
fuente