script - powershell tutorial
Imprimir las propiedades del objeto en Powershell (5)
Cuando trabajo en la consola interactiva si defino un nuevo objeto y le asigno algunos valores de propiedad de esta manera:
$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 brinda un resumen de las propiedades y valores del objeto:
PS C:/demo> $obj
SomeProperty
------------
Test
Básicamente quiero hacer esto, pero desde dentro de 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 volver. Intenté usar Write-Host dentro de la función:
Write-Host $obj
Pero esto solo muestra el tipo de objeto, no el resumen:
System.Object
¿Cómo puedo hacer que mi función muestre un resumen de los valores de propiedad del objeto a la ventana de Powershell?
Mi solución a este problema fue usar el bloque de subexpresión $ () .
Add-Type -Language CSharp @"
public class Thing{
public string Name;
}
"@;
$x = New-Object Thing
$x.Name = "Bill"
Write-Output "My name is $($x.Name)"
Write-Output "This won''t work right: $x.Name"
Da:
My name is Bill
This won''t work right: Thing.Name
Para imprimir las propiedades y los valores del objeto en Powershell. A continuación, los examples funcionan bien para mí.
$ pool = Get-Item "IIS: / AppPools.NET v4.5"
$ pool | Get-Member
TypeName: Microsoft.IIs.PowerShell.Framework.ConfigurationElement#system.applicationHost/applicationPools#add
Name MemberType Definition
---- ---------- ----------
Recycle CodeMethod void Recycle()
Start CodeMethod void Start()
Stop CodeMethod void Stop()
applicationPoolSid CodeProperty Microsoft.IIs.PowerShell.Framework.CodeProperty
state CodeProperty Microsoft.IIs.PowerShell.Framework.CodeProperty
ClearLocalData Method void ClearLocalData()
Copy Method void Copy(Microsoft.IIs.PowerShell.Framework.ConfigurationElement ...
Delete Method void Delete()
...
$ pool | Select-Object -Property * # Puede omitir -Property
name : .NET v4.5
queueLength : 1000
autoStart : True
enable32BitAppOnWin64 : False
managedRuntimeVersion : v4.0
managedRuntimeLoader : webengine4.dll
enableConfigurationOverride : True
managedPipelineMode : Integrated
CLRConfigFile :
passAnonymousToken : True
startMode : OnDemand
state : Started
applicationPoolSid : S-1-5-82-271721585-897601226-2024613209-625570482-296978595
processModel : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
...
Prueba esto:
Write-Host ($obj | Format-Table | Out-String)
o
Write-Host ($obj | Format-List | Out-String)
Nunca use Write-Host.
La forma correcta de generar información desde un cmdlet o función de PowerShell es crear un objeto que contenga sus datos y luego escribir ese objeto en la tubería mediante el uso de Write-Output.
-Don Jones: maestro de PowerShell
Lo ideal sería que su script creara sus objetos ( $obj = New-Object -TypeName psobject -Property @{''SomeProperty''=''Test''}
) luego haga un Write-Output $objects
. Debería canalizar la salida a Format-Table
.
PS C:/> Run-MyScript.ps1 | Format-Table
Realmente deberían llamar a PowerShell PowerObjectandPipingShell.
# Json to object
$obj = $obj | ConvertFrom-Json
Write-host $obj.PropertyName