Comprensión de los tipos de datos y aceleradores de PowerShell
Como muchos otros lenguajes, PowerShell usa objetos para casi todo. PowerShell tiene tipos de datos para "categorizar" tipos de objetos con diferentes esquemas de propiedades y métodos.
Una vez que comprenda los tipos de datos de PowerShell, pronto verá la capacidad de ahorrar tiempo de un concepto llamado aceleradores de tipo PowerShell. Los aceleradores son métodos para acelerar la asignación de tipos de datos en PowerShell.
En este artículo, aprenderá sobre varios tipos de datos de objetos y también cómo utilizar aceleradores para que sea más fácil trabajar con ellos.
Ejemplos de aceleradores de tipo
Incluso si no ha oído hablar de los aceleradores antes, lo más probable es que los haya usado mientras codificaba. Al utilizar PowerShell para obtener tipos, encontrará que [Array], [Bool] o [String] son todos aceleradores de tipos. Lo que ofrecen estos aceleradores de clases es un acceso rápido a las definiciones .NET más largas.
[Matriz] → [System.Array] [CmdletBinding] → [System.Management.Automation.CmdletBindingAttribute]
¿Cómo averiguamos cuáles son nuestras opciones para usar aceleradores dentro de PowerShell? ¡Siga leyendo para aprender todo sobre los aceleradores de tipos!
Descubra los tipos de datos de PowerShell obteniendo aceleradores de tipos
PowerShell ofrece un comando de una línea que devolverá todos los tipos de aceleradores conocidos por PowerShell. Por ejemplo, a continuación se muestran los aceleradores de tipos disponibles en un entorno PowerShell 7.
[PSObject].Assembly.GetType("System.Management.Automation.TypeAccelerators")::Get
Key Value
--- -----
Alias System.Management.Automation.AliasAttribute
AllowEmptyCollection System.Management.Automation.AllowEmptyCollectionAttribute
AllowEmptyString System.Management.Automation.AllowEmptyStringAttribute
AllowNull System.Management.Automation.AllowNullAttribute
ArgumentCompleter System.Management.Automation.ArgumentCompleterAttribute
ArgumentCompletions System.Management.Automation.ArgumentCompletionsAttribute
<SNIP>
Comprender cómo utilizar cada acelerador es una tarea completamente diferente. Para ello, es necesario comprender los constructores de un acelerador determinado. Usando el método GetConstructors, podemos descubrir los parámetros necesarios para un constructor.
Primero, recuperamos el acelerador URI para saber que hay seis tipos diferentes. Es posible que el resultado no siempre sea claro sobre qué valor usar; si es así, leer los documentos de referencia de Microsoft a menudo aclara cómo usar la clase.
( [Type]"URI" ).GetConstructors() | ForEach-Object {
( $_.GetParameters() | ForEach-Object { $_.ToString() } ) -Join ", "
}
Aceleradores de tipos de datos de PowerShell
Armado con la capacidad de encontrar aceleradores de tipos de datos de PowerShell y qué constructores pueden usar, ¡profundicemos en el uso de los más comunes!
URI
Las URL (localizadores uniformes de recursos) y las URI (identificadores uniformes de recursos) pueden ser difíciles de manipular. Muchas veces, el único recurso es utilizar la manipulación de cadenas para extraer los valores que necesita. .NET ofrece el acelerador de tipo URI para estas ocasiones.
El siguiente ejemplo demuestra cómo pasar una URL simple al acelerador URI. El resultado son los segmentos componentes del URI y hace que la manipulación sea mucho más rápida.
[URI]"https://google.com/"
Una vez que tenga un objeto URI, hay métodos simples disponibles para su uso posterior, como se ve en el resultado Get-Member a continuación.
$URI = [URI]"https://google.com/"
$URI | Get-Member -Type Method
WMI, WMISearcher, WMIClass
Muchos administradores veteranos de PowerShell conocen WMI o el Instrumental de administración de Windows. Muchas configuraciones de Windows existen dentro del marco WMI. Entonces, ¿qué podemos hacer con los aceleradores WMI, WMISearcher y WMIClass?
WMIClass: acceda a las propiedades y métodos estáticos de una clase.WMISearcher: crea una búsqueda de objetos WMI.WMI: recupera una única instancia de una clase.
A continuación se muestra el código que utiliza los tres métodos para crear el proceso notepad.exe, localizar ese proceso y luego recuperar más detalles del proceso.
# Create notepad.exe Process
$ProcessManager = [WMICLASS]"root\cimv2:WIn32_Process"
$ProcessManager.Create("notepad.exe")
# Locate the notepad.exe process
$Search = [WmiSearcher]'SELECT * FROM Win32_Process'
$Processes = $Search.Get()
$Process = $Processes | Where-Object Name -Match "Notepad"
# Use WMI accelerator to retrieve the notepad.exe process
$WMIProcess = [WMI]("\.\root\cimv2:Win32_Process.Handle='{0}'" -F $Process.ProcessId)
XML
Trabajar con documentos XML es un desafío. XML ofrece un formato flexible pero detallado. Intentar analizar un documento largo y complejo es difícil en cualquier idioma. PowerShell hace que esto sea mucho más fácil utilizando el acelerador de tipos de datos de PowerShell XML. Consuma un documento XML, ya sea desde una cadena o desde un archivo usando Get-Content.
$XML = [XML]"<note>
<to>Joe</to>
<from>Ashley</from>
<heading>Reminder</heading>
<body>Don't forget Bob's birthday this weekend!</body>
</note>"
$XML.Note.Body
Puede ver lo fácil que es navegar por los nodos para encontrar un valor específico. Por ejemplo, digamos que no queremos el nodo secundario heading. Las búsquedas XPath son fáciles de realizar utilizando el método SelectNodes. Usando SelectSingleNode para apuntar a un solo nodo, elimine el nodo usando el método RemoveChild.
$XPath = '/note'
$Nodes = $XML.SelectNodes($XPath )
$Nodes | ForEach-Object {
$Node = $_.SelectSingleNode('heading')
$_.RemoveChild($Node) | Out-Null
}
expresión regular
Las expresiones regulares facilitan las búsquedas complejas dentro del contenido de texto. Construir estas consultas es un desafío en sí mismo. Una vez que haya creado la consulta perfecta, puede utilizar el acelerador RegEx de PowerShell para realizar una coincidencia rápida en el contenido de texto.
Aunque técnicamente no es un tipo de datos de PowerShell, el acelerador de tipos regex aún puede reducir enormemente la realización de coincidencias de expresiones regulares.
A continuación se muestra un método de coincidencia RegEx simple. Cree una expresión regular simple y llame al método Match en una cadena de texto para realizar una búsqueda.
([RegEx]'\d{8}').Match('This will find the first 8 values, like 12345678').Value
Fecha y hora
Lo común en PowerShell es la necesidad de trabajar con fechas en scripts. Hay muchas formas de manipular la fecha y la hora. Una forma sencilla, con muchos métodos útiles, es utilizar el acelerador del tipo de datos [DateTime] de PowerShell. Algunas de las técnicas más útiles son:
- Analizar una cadena de fecha y hora
- Formatear una fecha y hora
- Operaciones aritméticas de fecha y hora
Analizar una cadena de fecha y hora
Dado un formato de fecha conocido (es decir, no es un formato personalizado), el acelerador DateTime devolverá un objeto System.DateTime válido, que es el mismo tipo de objeto cuando se usa la función Get-Date.
[DateTime]::Parse('2020-08-10')
Formatear una fecha y hora
Los archivos de datos suelen necesitar una cadena de fecha y hora en un formato único. Por ejemplo, tomemos la misma fecha que creamos anteriormente y llamemos al método ToString. A este método, le pasaremos el formato de fecha personalizado, MM_dd_yyyy-hh:mm:ss. Tenga en cuenta que este no es un formato típico, pero utilizando el método ToString, generaremos correctamente la fecha en este formato.
([DateTime]::Parse('2020-08-10')).ToString('MM_dd_yyyy-hh:mm:ss')
Operaciones aritméticas de fecha y hora
Sumar y restar tiempo de un objeto datetime existente es crucial. En lugar de utilizar soluciones complicadas, aproveche la clase DateTime para realizar estas operaciones.
([DateTime]::Parse('2020-08-10')).AddDays(5)
(([DateTime]::Parse('2020-08-10')).AddDays(5)).AddMonths(-2)
Con 5 días agregados, también debemos eliminar dos meses. A pesar de utilizar el método AddMonths, pasar un valor negativo resta el tiempo. Encadenando operaciones, usando paréntesis, llegamos al resultado deseado.
Espacio de tiempo
Al igual que la clase DateTime, la clase TimeSpan facilita el trabajo con rangos de tiempo. A diferencia de DateTime, se encuentran disponibles operaciones matemáticas adicionales, como división y multiplicación.
Crear un objeto de intervalo de tiempo
Hay varias formas de construir un valor de período de tiempo. En nuestro ejemplo, utilizamos el constructor Horas, Minutos, Segundos. Otros posibles constructores se muestran a continuación.
- Garrapatas
- Horas, Minutos, Segundos
- Días, Horas, Minutos, Segundos
- Días, Horas, Minutos, Segundos, Milisegundos
$TimeSpan = [TimeSpan]::New(1,0,0)
$TimeSpan
Multiplicación y división en un lapso de tiempo
Digamos que ha definido un período de tiempo determinado, pero desea saber cuánto sería tres veces ese rango. Es sencillo de hacer usando el método Multiplicar.
$TimeSpan.Multiply(3)
¿Pero qué pasa con la división? ¿Cómo dividiríamos un intervalo de tiempo determinado en cuartos? Podemos utilizar el método Dividir para encontrar los valores de los cuartos del lapso de tiempo.
$TimeSpan.Divide(4)
Dirección IP
Navegar por la gestión de direcciones IP es una tarea ardua, al igual que la validación. El acelerador IPAddress ofrece la capacidad de validar direcciones IPv4 e IPv6.
[IPAddress]"10.0.0.1"
Como puede ver, esta es una dirección IP válida, pero ¿qué pasaría si tuviéramos un valor que no estuviéramos seguros de que fuera una dirección correcta? Pasar una dirección con formato incorrecto o fuera de rango generará un error al informar del valor incorrecto.
[IPAddress]"258.0.0.1"
PSCredencial
Proteger las credenciales es fundamental para interactuar con servicios web, sistemas remotos o aplicaciones de terceros. La clase PSCredential cifra una contraseña en un objeto. Pasar este objeto a funciones y cmdlets facilita la autenticación.
En el siguiente ejemplo, estamos creando un objeto PSCredential utilizado para almacenar nuestros valores seguros. Tenga en cuenta que el valor de la contraseña requiere una cadena segura.
[PSCredential]::New("username", ("password" | ConvertTo-SecureString -AsPlainText -Force))
Aunque vemos el valor del nombre de usuario generado aquí, no vemos el valor de la contraseña. ¿Cómo recuperamos eso?
$Credential = [PSCredential]::New("username", ("password" | ConvertTo-SecureString -AsPlainText -Force))
$Credential | Format-List
La forma más sencilla de recuperar la contraseña de este objeto es utilizar el método GetNetworkCredential. A continuación devolveremos la propiedad contraseña.
$credential.GetNetworkCredential().Password
Conclusión
Los aceleradores de tipos de datos de PowerShell facilitan las operaciones complejas en PowerShell. Hay muchos aceleradores, pero con estos consejos, deberías poder usar Powershell para obtener muchos tipos y descubrir nuevos usos. A menudo existen formas únicas de utilizar los aceleradores. ¡Aprender estas diferencias aumentará drásticamente tu productividad!
















