Objetos en PowerShell

PowerShell

Este es uno de los capítulos del tutorial PowerShell. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

Una de las características mas interesantes, o al menos a mi así me lo parece, de PowerShell es que se trata de una herramienta orientada a objetos. Evidentemente, si no conoces que es esto de la programación orientada a objetos, esto podría representar un problema para ti. Sin embargo, como irás descubriendo en este capítulo del tutorial, y en los que están por venir, esto va a ser mas ventaja que inconveniente. Rápidamente, te acostumbrarás a tratar con objetos, sus propiedades y sus métodos. Así, este capítulo está dedicado a los objetos en PowerShell.

Sin embargo, esto no debe ser nada nuevo para ti. En el capítulo anterior, uno de los tres cmdlet de ayuda que viste era Get-Member. Este cmdlet, precisamente te permite obtener las propiedades o atributos y los métodos de un determinado objeto. Así por ejemplo, en el capítulo anterior veías las propiedades y métodos del comando Get-Help.

En este capítulo, profundizarás en que son los objetos, y en particular en los objetos en PowerShell.

Objetos en PowerShell

Objetos en PowerShell

¿Que es eso de los objetos?

Un objeto no es mas que una abstracción de un elemento, dotando a este objeto de una serie de propiedades y métodos.

Las propiedades se refieres a las características intrínsecas del objeto. Mientras que los métodos son las acciones que puedes realizar con ese objeto. Un ejemplo que seguro que te va a clarificar esto de los objetos son los archivos.

Un archivo cualquiera de los que se encuentran en tu equipo, no es mas que un objeto, ni mas ni menos, ni menos ni mas. Este archivo, el que tu quieras, tiene una serie de características, como son por ejemplo, el nombre del archivo, el directorio en el que se encuentra, la extensión, si existe, la última vez que accediste él, y muchos otros.

Respecto a los métodos de ese archivo, como te he indicado son las acciones que puedes realizar sobre el archivo. Por ejemplo, la primera que se me ocurre es borrar el archivo. Así de sencillo, (Get-Item test).Delete().

Get-Member

Ahora, con la cabeza puesta en los objetos, ya tienes clara la importancia del cmdlet de ayuda, Get-Member que viste en el capítulo anterior. Para poder, profundizar en este cmdlet y en los objetos, voy a utilizar el cmdlet New-Item que te permite entre otras cosas crear archivos. Así, lo primero es crear un archivo que se va a llamar ejemplo.txt. Para esto, ejecuta la siguiente instrucción,

New-Item -Name ejemplo.txt -ItemType File

Si ahora ejecutas el cmdlet verás que entre los archivos y directorios que se lista ha aparecido ejemplo.txt. De hecho, puedes confirmar su existencia, verificando la propiedad Exists,

(Get-Item ejemplo.txt).Exists

Si quisieras ver todas las propiedades y métodos de tu nuevo objeto archivo llamado ejemplo.txt. Tienes que ejecutar la siguiente instrucción,

Get-Item ejemplo.txt | Get-Member

En el siguiente capítulo del tutorial te explicaré que es esto del |. Por ahora, simplemente te tienes que quedar que es una forma de encadenar la salida de un comando con la entrada del siguiente.

Propiedades

Si quieres mostrar solo las propiedades, lo tienes que hacer de la siguiente forma,

Get-Item ejemplo.txt | Get-Member -MemberType Property

Esto te arrojará el siguiente resultado,

   TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
Directory         Property   System.IO.DirectoryInfo Directory {get;}
DirectoryName     Property   string DirectoryName {get;}
Exists            Property   bool Exists {get;}
Extension         Property   string Extension {get;}
FullName          Property   string FullName {get;}
IsReadOnly        Property   bool IsReadOnly {get;set;}
LastAccessTime    Property   datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   datetime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;}
Length            Property   long Length {get;}
Name              Property   string Name {get;}

En la definición de cada una de las propiedades de tu objeto archivo, está el tipo de propiedad que devuelve, así como si es de lectura o de lectura y escritura.

¿A que me refiero con lectura o lectura y escritura? Existen determinadas propiedades que solo puedes tener información de ellas. Por ejemplo, que un archivo exista, Exists, es una propiedad de solo lectura, no puedes decirle al archivo que no exista. Para esto, necesitas utilizar un método, el método Delete() que te he comentado anteriormente.

Sin embargo, la propiedad IsReadOnly que indica si tu archivo es de lectura solo si que lo puedes modificar. Así si ejecutas (Get-Item ./ejemplo.txt).IsReadOnly, te devolverá el valor False, indicando que tu archivo no es de solo lectura. Sin embargo, si lo quieres convertir en solo lectura, simplemente tienes que ejecutar (Get-Item ejemplo.txt).IsReadOnly = 1, y ahora al volver a ejecutar (Get-Item ejemplo.txt).IsReadOnly si que te devolverá True.

Si quieres listar todas las propiedades de un determinado archivo o directorio, puedes hacerlo como te muestro para el archivo ejemplo.txt,

Get-Item ejemplo.txt | Select-Object -Property *

Cuyo resultado será similar al que puedes ver a continuación,

SPath              : Microsoft.PowerShell.Core\FileSystem::/home/lorenzo/ejemplo.txt
PSParentPath        : Microsoft.PowerShell.Core\FileSystem::/home/lorenzo
PSChildName         : ejemplo.txt
PSDrive             : /
PSProvider          : Microsoft.PowerShell.Core\FileSystem
PSIsContainer       : False
Mode                : --r--
ModeWithoutHardLink : --r--
VersionInfo         : File:             /home/lorenzo/ejemplo.txt
                      InternalName:     
                      OriginalFilename: 
                      FileVersion:      
                      FileDescription:  
                      Product:          
                      ProductVersion:   
                      Debug:            False
                      Patched:          False
                      PreRelease:       False
                      PrivateBuild:     False
                      SpecialBuild:     False
                      Language:         

BaseName            : ejemplo
Target              : 
LinkType            : 
Length              : 0
DirectoryName       : /home/lorenzo
Directory           : /home/lorenzo
IsReadOnly          : True
FullName            : /home/lorenzo/ejemplo.txt
Extension           : .txt
Name                : ejemplo.txt
Exists              : True
CreationTime        : 19/1/2021 21:30:00
CreationTimeUtc     : 19/1/2021 20:30:00
LastAccessTime      : 19/1/2021 21:30:00
LastAccessTimeUtc   : 19/1/2021 20:30:00
LastWriteTime       : 19/1/2021 21:30:00
LastWriteTimeUtc    : 19/1/2021 20:30:00
Attributes          : ReadOnly

También puedes listar utilizando comodines, como en el ejemplo siguiente,

PS /home/lorenzo> Get-Item *.txt | Select-Object -Property CreationTime,Name,Extension

CreationTime       Name         Extension
------------       ----         ---------
19/1/2021 21:30:00 ejemplo.txt  .txt
19/1/2021 21:30:00 ejemplo2.txt .txt

Métodos

Ahora si lo que quisieras ver son los métodos que tiene tu archivo ejemplo.txt, lo que tienes que hacer es ejecutar la siguiente instrucción,

Get-Item ejemplo.txt | Get-Member -MemberType Method

Recuerda que no es necesario que todos los cmdlet y sus parámetros de memoria, ni mucho menos. Además de utilizar el cmdlet Get-Help, recuerda que siempre tienes la posibilidad de pulsar la tecla tab para autocompletar. El autocompletado es tu ayudante fiel.

Para el caso anterior, el resultado es el siguiente,

Name                      MemberType Definition
----                      ---------- ----------
AppendText                Method     System.IO.StreamWriter AppendText()
CopyTo                    Method     System.IO.FileInfo CopyTo(string destFi...
Create                    Method     System.IO.FileStream Create()
CreateText                Method     System.IO.StreamWriter CreateText()
Decrypt                   Method     void Decrypt()
Delete                    Method     void Delete()
Encrypt                   Method     void Encrypt()
Equals                    Method     bool Equals(System.Object obj)
GetHashCode               Method     int GetHashCode()
GetLifetimeService        Method     System.Object GetLifetimeService()
GetObjectData             Method     void GetObjectData(System.Runtime.Seria...
GetType                   Method     type GetType()
InitializeLifetimeService Method     System.Object InitializeLifetimeService()
MoveTo                    Method     void MoveTo(string destFileName), void ...
Open                      Method     System.IO.FileStream Open(System.IO.Fil...
OpenRead                  Method     System.IO.FileStream OpenRead()
OpenText                  Method     System.IO.StreamReader OpenText()
OpenWrite                 Method     System.IO.FileStream OpenWrite()
Refresh                   Method     void Refresh()
Replace                   Method     System.IO.FileInfo Replace(string desti...
ToString                  Method     string ToString()

Ahora ya estás en disposición de trabajar de trabajar con algunos de los métodos que puedes ver en el ejemplo anterior,

  • (Get-Item ejemplo.txt).CopyTo("ejemplo2.txt") copia tu primer archivo creado con PowerShell, ejemplo.txt, en tu segundo archivo ejemplo2.txt.
  • (Get-Item ejemplo.txt).Delete() borra el archivo ejemplo.txt.
  • (Get-Item ejemplo.txt).GetHashCode() te devuelve el código hash del archivo ejemplo.txt.

Otra opción de copiar un archivo, en lugar de utilizar el método .CopyTo() del objeto archivo, es utilizar un cmdlet, en particular, se trata de utilizar Copy-Item como te muestro en el siguiente ejemplo,

Copy-To ejemplo2.txt ejemplo 3.txt

Sin embargo si lo haces así no te da ninguna información del resultado conseguido, como sucede con el método .CopyTo(). Si quieres obtener información, puedes ejecutar utilizando la opción -PassThru

PS /home/lorenzo> Copy-To ejemplo2.txt ejemplo 3.txt -PassThru

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
--r--           19/1/2021    21:30              0 ejemplo3.txt

Conclusión

Como ves esto de trabajar con objetos tiene sus ventajas. Has conseguido abstraerte por completo de algo como un archivo. Ahora un archivo es elemento que tiene unas propiedades y métodos que te permite, de forma sencilla, conocer su estado e interactuar con él.


Imagen de portada de Cater Yang en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada.