Objetos en PowerShell
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
¿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 archivoejemplo2.txt
.(Get-Item ejemplo.txt).Delete()
borra el archivoejemplo.txt
.(Get-Item ejemplo.txt).GetHashCode()
te devuelve el código hash del archivoejemplo.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
La entrada Objetos en PowerShell aparece primero en Atareao.