Manipulación de objetos
¿Qué es la noción de objeto?
Sin entrar en detalle en la programación orientada a objetos, vamos en esta sección a explicar con palabras algunas nociones esenciales que debe conocer cuando utiliza objetos… Para empezar, definamos lo que es un objeto.
En primer lugar, debe saber que no existe UNA definición única de lo que es un objeto. Diremos simplemente que se trata de un concepto informático abstracto para tratar de representar objetos del mundo real. Lo va a entender…
Un objeto posee características, llamados en la jerga «propiedades». También es posible interactuar con un objeto mediante «métodos».
Una moto posee, entre otras cosas, las características siguientes:
-
Modelo.
-
Cilindrada.
-
Potencia.
-
Color.
-
Peso.
-
Etc.
Si una moto fuese un objeto informático, acabaríamos de enumerar las propiedades del objeto.
Todo esto está muy bien, pero ¿qué acciones podemos realizar con nuestra moto?
Pues entre otras cosas, podemos:
-
Arrancar/parar el motor.
-
Acelerar/frenar.
-
Girar (a la derecha o a la izquierda).
-
Hacer un caballito/un stoppie.
-
Etc.
Lo ha entendido, todo esto representaría los métodos de nuestro objeto.
Ahora que está familiarizado con los términos «propiedad» y «método», introduciremos...
Manipulación de objetos
1. Las colecciones
Antes de empezar a manipular objetos individuales es importante saber que la mayor parte del tiempo tendremos primero que manipular una colección de objetos (una colección representa varios objetos, se trata también de otro término para designar una tabla).
En efecto, cuando ejecutamos un comando PowerShell, este devuelve muchas veces varios resultados. Tomemos el ejemplo siguiente:
PS > $result = Get-ChildItem C:\Windows
Hemos asignado el resultado del comando Get-ChildItem (equivalente a dir en CMD) a la variable $result. Esta última representa ahora una colección de objetos ya que el directorio C:\Windows contiene muchas carpetas y archivos. Los objetos contenidos en $result tienen por lo tantos tipos diferentes.
Para convencernos de ello, en modo interactivo, es decir desde la consola, aplicamos el comando Get-Member a nuestra variable:
PS > $result | Get-Member
TypeName: System.IO.DirectoryInfo
Name MemberType Definition
---- ---------- ----------
Mode CodeProperty System.String Mode{get=Mode;}
Create Method void Create(), void Create...
CreateObjRef Method System.Runtime.Remoting.Ob...
CreateSubdirectory Method System.IO.DirectoryInfo Cr...
Delete Method void Delete(), void Delete...
...
TypeName: System.IO.FileInfo
Name MemberType ...
Formateo de objetos para la visualización
Importante: los comandos de formateo han sido concebidos para mostrar los objetos en la consola de PowerShell (ISE o consola clásica). ¡En ningún caso debe usarlos en un script! Si comete este error, tendrá problemas para entender por qué su script no funciona correctamente. En efecto, los comandos de formateo modifican los objetos originales para crear objetos que se puedan mostrar en la consola. No debe por lo tanto confundir los comandos de formateo con el comando Select-Object.
Tratar una parte del tema de formateo de la visualización del resultado de comandos puede seguramente sorprenderle, pero sepa que dado el aspecto de orientación a objetos de PowerShell, esto es indispensable y comprenderá por qué.
Si también se pregunta por qué la ventana de la consola PowerShell es más generosa en términos de dimensiones que la de CMD, entonces esta parte responderá a sus preguntas…
Dado que PowerShell posee la posibilidad intrínseca de manipular objetos, todo lo que aparece en pantalla al ejecutar un comando no es sino una representación de algunas propiedades. En efecto, un objeto puede tener hasta decenas de propiedades, de modo que habría sido complicado mostrar todas en pantalla, y eso de manera inteligible. Así, la elección de propiedades, que llamaremos «propiedades por defecto», se realizó de manera arbitraria por los creadores de PowerShell.
Debe saber que el número de propiedades a mostrar depende en parte del tamaño de la ventana PowerShell. Este número depende también de lo que el usuario final está preparado para ver, ya que si para el equivalente de un simple dir tiene como retorno quince propiedades para cada archivo, esto sería rápidamente muy tedioso de leer e interpretar.
Quedémonos con el ejemplo de dir o, mejor, de Get-ChildItem.
PS > Get-ChildItem C:\
Directory : C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 11/12/2017 6:22 PM Logs ...
Creación de objetos personalizados
Resulta fundamental saber cómo devolver objetos y no texto bruto cuando se programa con PowerShell. PowerShell es realmente un shell orientado a objetos. Todo comando produce objetos como retorno, de modo que sería lógico que todos nuestros scripts y funciones devolvieran también objetos. Además de respetar las buenas prácticas, esto nos facilita enormemente la vida. De ahí la importancia de este capítulo…
En esta sección veremos cómo enriquecer un objeto existente aportando nuevas propiedades o métodos. Veremos también cómo crear un objeto desde la nada.
1. Transformación de un objeto existente
Aunque no hayamos todavía abordado CIM / WMI, vamos sin embargo a utilizar esta tecnología en los próximos ejemplos con el fin de producir algo de acuerdo a la realidad. En consecuencia, le recomendamos que lea el capítulo CIM/WMI si nunca ha oído hablar de estos términos.
En el siguiente ejemplo, recuperaremos la versión del sistema operativo de un conjunto de máquinas. Para ello, efectuaremos una consulta WMI sobre la clase Win32_OperatingSystem. Esta devolverá un objeto que contiene una serie de propiedades, cuyos nombres no son siempre evidentes. Vamos por lo tanto, a partir del objeto devuelto, a crear un objeto con nuevas propiedades.
Veamos primero lo que devuelve la línea de comandos siguiente:
PS > Get-CimInstance -ClassName Win32_OperatingSystem | Format-List *
Status : OK
Name : Microsoft Windows Server
2016 Standard|C:\Wi...
FreePhysicalMemory : 394268
FreeSpaceInPagingFiles : 724536
FreeVirtualMemory : 1189144
Caption : Microsoft Windows Server ...