Windows PowerShell: Muchas formas de crear un objeto personalizado
Realmente no importa cuál es el método que elija para la salida de objetos personalizados, como un objeto personalizado es el resultado final.
Don Jones
Recientemente, escribí un blog que describe un conjunto de 12 mejores prácticas para el uso de Windows PowerShell. La No. 12 mejores prácticas dirige gente a objetos de sus secuencias de comandos y funciones, en lugar de salida de texto de salida. Fui tan lejos como para sugerir que si nunca fueron con el cmdlet de escritura-Host, debe retroceder y reflexionar sobre lo que estaba haciendo. Toda escritura-Host es producir texto.
No mucho después de que salió en vivo, un lector contactó conmigo sobre el código que había utilizado para crear el objeto personalizado. Dijo que nunca había visto ese enfoque antes. Fue muy sorprendente, como Windows PowerShell parece ofrecer una docena de formas para hacer nada. Sugirió escribiera un artículo sobre las diferentes formas de producir un objeto personalizado, así que aquí estamos.
La forma de forma completa
Esta es la forma en la que mayoría de la gente probablemente elegiría para crear un objeto personalizado. Es lo que yo llamo el "enfoque manual". Tiene la ventaja de ser bastante claro, aunque se trata de escribir mucho. Suponiendo que tengo un objeto en el variable $ sistema operativo y otra en bios $, podía combinar piezas seleccionadas de información desde ellos como este:
$object = New-Object –TypeNamePSObject $object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber $object | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version $object | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber Write-Output $object
Puede seguir este patrón para agregar cualquier otra información que se necesita para el objeto de salida final, antes de escribir a la tubería.
-Paso: Un breve acceso directo
Se puede hacer ese primer acercamiento un poco más conciso diciendo agregar miembros a devolver el objeto en la tubería:
$object = New-Object –TypeNamePSObject $object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber –PassThru | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version –PassThru | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber Write-Output $object
Cuando termina una línea con un caracter, Windows PowerShell sabe ir a la siguiente línea física para buscar el siguiente comando en la tubería. Esencialmente, es una manera de romper un comando largo en múltiples líneas físicas. El truco, combinado con el conmutador –PassThru, esto hace una serie de tres distintos comandos.
Hashtable un Go-Go
Mientras que los enfoques anteriores son efectivos, también son muy prolijas. En una secuencia de comandos, realmente puede ser difícil determinar visualmente lo que está sucediendo. Mediante la función de nuevo objeto es un enfoque más conciso. Esto le permite crear una tabla hash (o matriz asociativa) que contiene los nombres de propiedades y valores que desee agregar al objeto recién creado. Estas propiedades son cada uno crea automáticamente como un NoteProperty:
$properties = @{'OSBuild'=$os.BuildNumber; 'OSVersion'=$os.version; 'BIOSSerial'=$bios.SerialNumber} $object = New-Object –TypeNamePSObject –Prop $properties Write-Output $object
Esto tiene el mismo efecto, pero es mucho más conciso. Alguna gente inteligente usará una expresión entre paréntesis para hacerla aún más corto. Sin embargo, creo que esto hace un poco más difícil de leer:
$object = New-Object –TypeNamePSObject –Prop (@{'OSBuild'=$os.BuildNumber; 'OSVersion'=$os.version; 'BIOSSerial'=$bios.SerialNumber}) Write-Output $object
Yendo un poco más lejos
Observará que en todos estos ejemplos, guardar el objeto personalizado a una variable (objeto$) antes de escribir a la tubería. La razón es simple. Tal vez desee manipular el objeto un poco más. Por ejemplo, puede darle un nombre de tipo personalizado de su objeto:
$object.PSObject.TypeNames.Insert(0,'My.Custom.Name')
Hacer esto le permite crear un predeterminado personalizado diseño para mostrar el objeto de formato. He utilizado este truco con gran efecto en "Windows PowerShell Scripting y herramientas" (concentrado de tecnología y capacitación técnica de interfaz, 2011), un libro que escribí se centra en cosas como el uso de objetos personalizados como salida de herramientas de Windows PowerShell a medida.
Trazos diferentes para gente diferente
No hay ningún "equivocada" para hacer cualquier cosa en Windows PowerShell, como su enfoque obtiene el trabajo realizado. Dicho esto, hay ciertos enfoques evitar, sobre todo porque son menos legible y más difícil de enseñar, especialmente a los recién llegados. Aquí está uno, aún suponiendo que mi $os variables y $bios contienen los objetos crudos que quiero extraer información desde:
$os | Select-Object –Property @{n='OSVersion';e={$_.Version}}, @{n='OSBuild';e={$_.BuildNumber}}, @{n='BIOSSerial';e={$bios.SerialNumber}}
Podrá generar los mismos resultados que los ejemplos anteriores, pero la sintaxis es terrible. Hay muchos signos de puntuación, lotes de estructura y tienen que entender mucho sobre lo que está haciendo Select Object con esos tres tablas hash.
Básicamente está generando propiedades personalizadas utilizando una sintaxis única a este cmdlet (y compartida por los cmdlets de formato). Verá la sintaxis utilizada por gente con un fondo de estilo de desarrollo de software. Es más difícil para mí (y muchos otros amigos) analizar mentalmente, por lo que tiendo a no utilizarlo como mucho.
PowerShell es nada si no Flexible
Windows PowerShell es el único que le permite salir con algunas cosas locos. Por ejemplo, volver a mi ejemplo de hashtable. También podría hacerlo así:
$info = @{} $info.OSBuild=$os.BuildNumber $info.OSVersion=$os.version $info.BIOSSerial=$bios.SerialNumber $object = New-Object –TypeNamePSObject –Prop $info Write-Output $object
Está creando un hashtable vacía y, a continuación, agregar información haciendo referencia a propiedades que no existen. Cuando primero intentar acceder OSBuild, por ejemplo, Windows PowerShell comprende que esos bienes no existe en el objeto info de $ (que era un hashtable vacía). Implícitamente se crea la propiedad y se asigna el valor. Cosas locos, pero funciona.
La Moral está: Objetos, no texto
Sin embargo elige crear objetos personalizados, puede crear objetos personalizados en lugar de salida de texto simple a la ventana de la consola. Los objetos son infinitamente más flexibles, y permiten la salida de la secuencia de comandos o la función integrar con todo lo demás Windows PowerShell.
Don Joneses un premio de MVP de Microsoft y autor de "Aprender Windows PowerShell en un mes de comidas" (publicaciones de Manning, 2011), un libro diseñado para ayudar a cualquier administrador efectivizada con Windows PowerShell. Jones también ofrece formación de Windows PowerShell in situ y pública. Contacto con él a través de su sitio Web en ConcentratedTech.com.