Saltar al contenido

¿Cuál es la diferencia entre un cmdlet y una función?

Al fin después de tanto luchar pudimos encontrar el arreglo de esta incógnita que ciertos de nuestros usuarios de este sitio web han tenido. Si quieres compartir algún detalle puedes aportar tu comentario.

Solución:

Para complementar la útil respuesta de Bruce Payette:

No todas las funciones se crean de la misma manera en PowerShell:

  • Un avanzado función es el escrito en PowerShell análogo de un cmdlet (que, como se ha dicho, es compilado desde un lenguaje .NET); decorar una función param(...) bloque con el [CmdletBinding()] attribute o decorar al menos un parámetro con un [Parameter()] attribute gracias ansgar wiechers
    es lo que lo convierte en un avanzado uno; como tal, soporta ciertos comportamientos estándar:

    • Obtiene soporte automático para parámetros comunes como -Verbosey -OutVariable y, si la función se implementa en consecuencia, para -WhatIf y -Confirm.
    • Los argumentos no vinculados a parámetros declarados explícitamente dan como resultado un error en la invocación.
    • Por lo general, pero no necesariamente, las funciones avanzadas admiten el procesamiento de entrada de tubería uno por uno a través de un process ... bloque de script, a través de parámetros de vinculación de parámetros decorados con ValueFromPipeline y/o ValueFromPipelineByPropertyName.

    • Desafortunadamente, incluso las funciones avanzadas y los cmdlets no se crean completamente iguales:

      • Las funciones avanzadas se ejecutan en un ámbito de la variable secundariaa diferencia de los cmdlets.

        • Sin embargo, es posible obtener acceso a las variables de la persona que llama incluso en funciones colocadas en módulos (para las funciones fuera de los módulos, las variables de la persona que llama son visibles de forma predeterminada, debido al alcance dinámico de PowerShell), a través de la $PSCmdlet.SessionState.PSVariable objeto, como se muestra en esta respuesta.
      • Se aplican funciones avanzadas cultura-invariante conversiones de parámetros, a diferencia de los cmdlets.

      • Funciones avanzadas, en Windows PowerShellresolver ValueFromRemainingArguments diferente a los cmdlets.
        • Esta inconsistencia se resolvió en PowerShell Centropero, desafortunadamente, de una manera que creó más problemas de los que resolvió; consulte los problemas de GitHub n.º 5955 y n.º 6451.
  • UN sencillo funciónpor el contrario:

    • es apropiado para secuencias de comandos y módulos internos ayudante funciones
    • requiere menos “ceremonia” (sintaxis más simple sin parámetro attributescuerpo de bloque de script único)
    • Sin embargo, aún puede procesar la entrada de la tubería a través de una variable automática. $Input o incluso a través de un process ... bloquear, si lo desea.
    • también corre en un alcance del niño por defecto; fuera de los módulos (cuya función simple no debería exportarse de todos modos), las variables de la persona que llama son visible debido al alcance dinámico de PowerShell; modificando ellos (lo que generalmente debe evitarse) requiere llamadas a Set-Variable con -Scope 1.
    • Tenga en cuenta que también hay un especializado, pero rara vez se utiliza variante de una función simple optimizada para el procesamiento de tuberías, definida con el Filter palabra clave. Su cuerpo se invoca implícitamente para cada objeto de entrada de tubería, reflejado en la variable automática $_.

Mientras exportar funciones como parte de un módulo – preferiblemente a través de su manifiesto de módulo (*.psd1) – no hacer cumplir que las funciones sean avanzado unos, es buena práctica para exportar solamente avanzado funciones.

Un cmdlet es una clase .NET escrita en C# u otro lenguaje .NET y contenida en un .dll (es decir, en un módulo binario). Una función se especifica directamente en PowerShell en un script, módulo de script o en la línea de comando. Un manifiesto de módulo puede incluir módulos binarios y de secuencias de comandos, por lo que el manifiesto debe poder exportar cmdlets y funciones. Incluso es posible exportar un cmdlet y una función con el mismo nombre desde un solo manifiesto, aunque por lo general no se recomienda.

Si guardas algún titubeo o forma de progresar nuestro ensayo puedes ejecutar una anotación y con deseo lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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