¿Cómo crear funciones avanzadas con PowerShell CmdletBinding? – TrucosInformaticos

Powershell

¿Estás listo para llevar tus habilidades de PowerShell al siguiente nivel y liberar el verdadero poder de las funciones avanzadas? ¡No busque más! En esta publicación de blog, lo guiaremos a través del fascinante mundo del atributo CmdletBinding de PowerShell, un atributo revolucionario que puede potenciar sus capacidades de secuencias de comandos.

Requisitos

  • Una computadora con Windows PowerShell 5.1 o PowerShell 7.x y posterior.
  • Un editor de scripts, como Visual Studio Code o PowerShell ISE.

Funciones simples versus funciones avanzadas

¿Alguna vez te has preguntado cómo los cmdlets compilados, como los integrados, incluidos Get-Process, Get-Service, etc., tienen un conjunto de parámetros predeterminado? Parámetros como -Acción de error, -Acción de advertenciay -Verboso, para nombrar unos pocos. Eso es porque incluyeron el Enlace de cmdlet atributo cuando fueron desarrollados y compilados.

Pero no es necesario escribir cmdlets en Microsoft .NET para acceder a estas funciones avanzadas. Puedes usar el Enlace de cmdlet atributo en sus scripts y funciones.

Entonces, ¿cuál es la diferencia entre funciones simples y avanzadas? Como referencia, tengo dos funciones convenientemente nombradas Función simple y Función avanzada.

Para ilustrar la diferencia, mostraré la sintaxis de ambos:

Get-Command Simple-Function -Syntax 
Get-Command Advanced-Function -Syntax

El resultado muestra que la función avanzada tiene más parámetros, como -Y si y -Confirmar. También tiene acceso al PowerShell. parámetros comunes. Además, al parámetro se le asigna un tipo de datos específico (cadena) y se puede configurar como obligatorio.

Exploraremos cómo puede utilizar estos parámetros de funciones avanzadas con el atributo CmdletBinding de PowerShell.

Convertir una función simple en avanzada agregando el atributo CmdletBinding

Comencemos creando una función simple llamada matar-pokemon. Esta función comienza con este código:

Function Kill-Pokemon { 
param ( 
$Name 
) 
Write-Output "You just killed $Name." 
}

Cuando ejecuta esta función, obtendrá el siguiente resultado.

enlace de cmdlet

Comprobando su sintaxis, podrás confirmar que no es una función avanzada.

Get-Command Kill-Pokemon -Syntax

Ejemplo de enlace de cmdlet de PowerShell

Entonces, ¿cómo hacemos que esta función sea avanzada? Dos cosas: agregue el atributo CmdletBinding y el bloque de parámetros.

Function Kill-Pokemon { 
[CmdletBinding()] 
param ( 
[Parameter()] 
[String] 
$Name 
) 
Write-Output "You just killed $Name." 
}

La función ahora tiene acceso a los parámetros comunes y el parámetro está fuertemente tipado.

Atributo cmdletBinding

Lo que significa que la función ahora tiene estos parámetros adicionales.

Agregue el atributo CmdletBinding

Agregar el argumento SupportsShouldProcess

El SoportesDeberíaProceso El argumento del atributo CmdletBinding expone dos nuevos parámetros de la función.

  • -Y si — Este parámetro muestra un mensaje sobre lo que hará la función sin ejecutarla.
  • -Confirmar — Este parámetro solicita al usuario que confirme la acción pendiente que realizará la función. Si el usuario confirma, la acción continuará. Si el usuario no confirma, la acción se detendrá.

Ahora actualicemos la función.

Function Kill-Pokemon { 
[CmdletBinding( 
SupportsShouldProcess 
)] 
param ( 
[Parameter()] 
[String] 
$Name 
) 

if ($PSCmdlet.ShouldProcess($Name)) { 
Write-Output "You just killed $Name." 
} 
}

En este ejemplo, el SoportesDeberíaProceso El argumento se inserta en el Enlace de cmdlet atributo. Para aplicar este argumento, debes hacer referencia a él usando esta línea: $PSCmdlet.ShouldProcess($Nombre)dónde $Nombre es el parámetro involucrado.

Pruebe el -Y si parámetro:

Kill-Pokemon -Name Bulbasaur -WhatIf

Como puede ver, el resultado le indica qué le habría hecho la operación al objetivo.

Soporta el argumento del proceso debería

Ahora, prueba el -Confirmar parámetro.

Kill-Pokemon -Name Bulbasaur -Confirm

Con él, la función solicita confirmación. Respondiendo con Y o A confirmará la operación.

insertado en el atributo CmdletBinding

Agregar el argumento ConfirmImpact

En la sección anterior, agregamos el debería procesar argumento que expuso la -Confirmar parámetro. Pero la confirmación sólo se activa cuando especifica el -Confirmar parámetro durante la ejecución.

Por otra parte, el Confirmar impacto El argumento muestra automáticamente el mensaje de confirmación si el nivel de impacto coincide con el $ConfirmarPreferencia variable (Baja, Media, Alta).

En este ejemplo, el $ConfirmarPreferencia El valor es alto.

Argumento de confirmación de impacto

Modifiquemos la función para agregar el Confirmar impacto argumento y ponerlo a nivel Alto.

Function Kill-Pokemon { 
[CmdletBinding( 
SupportsShouldProcess, 
ConfirmImpact="High" 
)] 
param ( 
[Parameter()] 
[String] 
$Name 
) 

if ($PSCmdlet.ShouldProcess($Name)) { 
Write-Output "You just killed $Name." 
} 
}

Cuando ejecuta la función, el mensaje de confirmación se activa incluso si no utiliza el -Confirmar parámetro.

¿Qué es CmdletBinding en PowerShell?

La confirmación se activó porque establecimos expresamente el nivel de impacto de la función en Alto. Si configuramos el nivel de impacto de la función en algo más bajo, como, Mediola confirmación no debería activarse.

atributo de enlace de cmdlet de PowerShell

La confirmación no se mostró porque el nivel de impacto de la función es menor (Medio) que la $ConfirmarPreferencia valor (Alto).

Uso de atributos de parámetros avanzados

El atributo PowerShell CmdletBinding ha abierto más oportunidades para personalizar y controlar sus funciones. Una es la capacidad de controlar los atributos de los parámetros, como hacerlos obligatorios, incluirlos en un conjunto de parámetros único, definir su posición y permitirles aceptar valores de la canalización.

Hacer cumplir los parámetros obligatorios

Puede hacer que un parámetro sea obligatorio en una función agregando el Obligatorio = $falso argumento. También puedes utilizar la versión abreviada. Obligatorio.

En este ejemplo, hagamos que la variable $Name sea obligatoria.

param ( 
[Parameter( 
Mandatory 
)] 
[String] 
$Name 
)

Entonces, si ejecuta la función sin especificar el parámetro -Name, se le pedirá que lo ingrese.

parámetro de enlace de cmdlet de PowerShell

Configuración de la posición del parámetro

Puede especificar la posición de un parámetro agregando el Posición = norte argumento. Cuando un parámetro es posicional, especificar el nombre del parámetro antes del valor se vuelve opcional.

param ( 
[Parameter( 
Mandatory, 
Position = 1 
)] 
[String] 
$Name, 
[Parameter( 
Position = 2 
)] 
[String] 
$Type 
)

En el ejemplo anterior, el Nombre El parámetro está en posición. 1mientras que la Tipo El parámetro está en posición. 2. Entonces, en lugar de emitir el siguiente comando:

Kill-Pokemon -Name Pikachu -Type Electric

Puede eliminar el nombre del parámetro y simplemente proporcionar el valor del parámetro siguiendo sus posiciones.

Kill-Pokemon Pikachu Electric

Y el resultado será el mismo.

Acerca de CmdletBinding

Aceptar valores del pipeline

Otra característica de función avanzada es aceptar un valor de la canalización. Para habilitar esta función, debe agregar el Valor de tubería atributo al parámetro. Por ejemplo, para hacer que el parámetro -Name acepte su valor de la canalización:

[Parameter( 
Mandatory, 
Position = 1, 
ValueFromPipeline 
)]

¿Qué quiere decir esto? En lugar de ejecutar este comando especificando el parámetro -Name.

Kill-Pokemon -Name Pikachu

Puedes hacer esto en su lugar.

"Pikachu" | Kill-Pokemon

La función producirá el mismo resultado.

Utilice el atributo CmdletBinding en PowerShell

Validación de parámetros

Otro uso excelente de las funciones avanzadas con CmdletBinding es la validación de parámetros. Hay muchos atributos de validación de parámetros, pero uno es el ValidarConjunto atributo.

La función de salida actualmente tiene dos parámetros: Nombre y Tipo. Supongamos que desea restringir los tipos solo para aceptar un conjunto predefinido de valores; entonces, puedes usar el ValidarConjunto atributo para definirlos.

En este ejemplo, el [ValidateSet()] El bloque contiene sólo cuatro valores en el conjunto.

[Parameter( 
Position = 2 
)] 
[ValidateSet( 
'Eletric', 
'Flying', 
'Poison', 
'Ground' 
)] 
[String] 
$Type

El efecto es que ahora sólo puedes ingresar los cuatro valores.

¿Qué es cmdletbinding y cómo funciona?

¿Qué pasa si ingresaste a la fuerza un valor no incluido en el ValidarConjunto ¿bloquear? Obtendrá el siguiente error.

Funciones avanzadas de cmdletBinding

Porque «Fantasma«no está en el ValidarConjunto bloque, es un valor no válido y la función falla.

Conclusión

El atributo PowerShell CmdletBinding revoluciona la forma en que los desarrolladores crean funciones avanzadas. Con CmdletBinding, podemos mejorar nuestras funciones con características como admitir parámetros comunes, habilitar la entrada de canalizaciones e implementar un manejo avanzado de errores. Tenemos control sobre parámetros obligatorios, opcionales y dinámicos para crear funciones que cumplan requisitos específicos.

El atributo del parámetro ValueFromPipeline de CmdletBinding facilita la integración perfecta con la canalización de PowerShell. Las funciones pueden aceptar sin esfuerzo entradas de la canalización, lo que permite una interacción fluida con otros comandos de PowerShell.

La validación de parámetros mejora aún más la flexibilidad y confiabilidad de la función. Los atributos de validación imponen restricciones de entrada, evitando errores y comportamientos inesperados. En resumen, el atributo CmdletBinding permite a los desarrolladores de PowerShell crear funciones avanzadas versátiles, eficientes y fáciles de usar.

Aprovechar sus capacidades genera un código más limpio y fácil de mantener, lo que ahorra tiempo y esfuerzo a largo plazo. Adopte esta poderosa característica y lleve las secuencias de comandos de PowerShell a nuevas alturas.

Lo que aprendió en esta publicación apenas roza la superficie y tiene como objetivo brindarle un punto de partida para implementar funciones avanzadas. Hay mucho más por descubrir y depende de usted descubrirlo y utilizarlo. ¡Buena suerte!

4/5 - (95 votos)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *