mandatory powershell binding

powershell - mandatory - ¿Qué es[cmdletbinding()] y cómo funciona realmente?



powershell arguments (3)

CmdletBinding, Parameter, etc. son clases de atributos especiales que los scripters pueden usar para definir el comportamiento de PowerShell, por ejemplo, hacer que una función sea una función avanzada con Cmdlet capabilites.

Cuando los llamas por ejemplo [CmdletBinding()] inicializas una nueva instancia de la clase.

Obtenga más información acerca de la clase CmdletBindingAttribute en: MSDN

Obtenga más información acerca de la clase ParameterAttribute en: MSDN

Más sobre las clases de atributos here y here

Regularmente uso [cmdletbinding()] en mis funciones o scripts, pero siempre he encontrado este material esotérico, tal vez algunos de ustedes puedan compartir sus luces.
De acuerdo con get-help about_Functions_CmdletBindingAttribute

El atributo CmdletBinding es un atributo de funciones que los hace funcionar como cmdlets compilados

pero podemos usarlo encima de nuestros scripts, ¿cuál es la función en este caso? una función "principal" implícita interna llamada por ps engine para todas sus entradas?

sobre la sintaxis ahora:

[CmdletBinding(ConfirmImpact=<String>, DefaultParameterSetName=<String>, HelpURI=<URI>, SupportsPaging=<Boolean>, SupportsShouldProcess=<Boolean>, PositionalBinding=<Boolean>)]

que estamos haciendo ? instanciar un objeto cmdlbinding y dar una lista de argumentos a su constructor? esta sintaxis se puede encontrar en param (), por ejemplo [Parameter(ValueFromPipeline=$true)] ¿esta sintaxis tiene un nombre particular y se puede encontrar en otra parte?

por último, ¿podemos, como simples powershellers, imitar esta funcionalidad y modificar el comportamiento de los scripts configurando un atributo?


Con respecto a la pregunta de sintaxis, el formato coincide estrechamente con la forma en que aplica una clase de atributo .NET a un miembro que usa parámetros nombrados en C #.

Compare la gramática (simplificada) para los atributos de la sección B.2.4 de la especificación del lenguaje de PowerShell con la de la sección C.2.13 de la especificación del lenguaje C # :

B.2.4 Atributos (PowerShell)

atributo:
[ nombre-atributo ( atributo-argumentos ) ]

argumentos de atributo:
atributo-argumento
atributo-argumento , argumentos-atributos

atributo-argumento:
simple-name = expresión

C.2.13 Atributos (C #)

atributo:
[ nombre-atributo ( lista-argumento-nombrado ) ]

named-argument-list:
argumento con nombre
named-argument-list , named-argument

argumento con nombre:
identificador = atributo-argumento-expresión


Estoy de acuerdo en que podría haber sido agradable, desde un sentido de brevedad conceptual, hasta, por ejemplo, reutilizar la sintaxis de inicialización de hashtats para la inicialización de atributos. Sin embargo, me puedo imaginar apoyando todas las opciones de hashtables (como [A(P=v)] y [A(''P''=v)] y $n = ''P''; [A($n=v)] y tal, o algún subconjunto particular de ellos) solo para usar ; como el personaje separador habría sido más problemático de lo que valía.

Por otro lado, si quieres usar funciones avanzadas, entonces quizás tenga sentido aprender una sintaxis avanzada :)


En términos generales, CmdletBinding es lo que hace que una función provenga de una función Avanzada. Ponerlo en la parte superior de un script hace que el script sea "avanzado". Las funciones y los scripts son muy parecidos, donde el nombre del archivo del script es equivalente al nombre de la función y el contenido del script es equivalente a la sección scripblock de una función.

Los atributos CmdletBinding le brindan control sobre las capacidades de la función, como agregar confirmación y soporte WhatIf (mediante SupportsShouldProcess), deshabilitar la vinculación posicional de los parámetros, y así sucesivamente.