Windows PowerShell: Escritura de cmdlets en secuencias de comandos

Don Jones

Una de las increíbles nuevas características en v2 Windows PowerShell-Comandos Virtual Machine Manager es la capacidad para escribir funciones muy mejoradas. Estas funciones, escritas completamente en la secuencia de comandos, tienen las mismas capacidades que un cmdlet “ real ” escritas en C# o Visual Basic y compiladas en Visual Studio. Estas funciones avanzadas de (they were originally called “script cmdlets” early in the v2 development cycle) escribir funciones más flexibles, a continuación, se puede utilizar junto con los cmdlets normales sin problemas.

Es todo en el enlace

La diferencia entre una función simple y un cmdlet completo es que los cmdlets admiten enlaces de parámetros eficaces. Puede utilizar los parámetros posicionales, denominadas parámetros, parámetros obligatorios y incluso realice comprobaciones de validación de parámetros básicos, por sólo tiene que describe el parámetro del shell. Aquí se muestra un ejemplo:

Implementar sus propios módulos

¿Cómo esta ayuda a distribuir las secuencias de comandos más fácilmente? El segundo tipo de módulo, un módulo de secuencia de comandos de , es la respuesta. Esto es simplemente un normal Windows PowerShell-Comandos Virtual Machine Manager script, con una extensión de nombre de archivo .psm1 en lugar de la extensión de nombre de archivo PS1 habitual. Colocar mymodule.psm1 en la carpeta de \modules le permite ejecutar de MyModule del módulo de importación y se ejecutará la secuencia de comandos.

Normalmente, un módulo de secuencia de comandos consiste en completamente de funciones. Es decir, cuando se importa el módulo, no hay nada realmente ejecuta, las funciones del módulo de secuencia de comandos se cargan en el shell y están disponibles en el shell. Suponga que tiene un módulo de secuencia de comandos que tiene un aspecto similar al siguiente:

function Get-Inventory {
    [CmdletBinding()]
    param (
        [parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string[]]$computername,
        
        [parameter(Mandatory=$false)]
        [alias("PF")]
        [switch]$pingfirst,
        
        [parameter(Mandatory=$true,Position=0)]
        [AllowEmptyString()]
        [string]$class
        
    )
    PROCESS {
    }
}

En esta declaración, he declarado tres parámetros:

  • nombre del equipo es una sola cadena o una matriz de cadenas. Es obligatorio, y acepta entradas de canalización de la cadena, lo que significa que si se canalizar en un montón de cadenas, que le se automáticamente quitar en la variable de NombreEquipo $.
  • pingfirst no es obligatorio, pero si lo utiliza, deberá utilizar el parámetro - alias de carpeta pública:. Se guardará un poco de escribir. Se trata de un parámetro del modificador, lo que significa que no acepta un valor. Está activado o desactivado.
  • clase también sea obligatorio, pero se Don incluso tienen que escribir-nombre de parámetro de la clase. Simplemente asígnele el valor adecuado como el valor de la primera posición cuando se ejecuta la función. Aunque esto es obligatorio, que acepte una cadena vacía.

Hay muchos más atributos y una gran cantidad de ejemplos, en la Ayuda en línea. Ejecutar Ayuda about_Functions_Advanced_Parameters para verlas todas.

Obtener acceso a los parámetros comunes

El shell define varios parámetros comunes compartidos por todos los cmdlets. Uno de ellos es - detallado, que sirve para indicar un cmdlet para obtener más información de lo habitual sobre lo que está haciendo de salida. La siguiente definición de función, sin embargo, se producirá un Windows PowerShell-Comandos Virtual Machine Manager:

function Test-Something {
    [CmdletBinding()]
    param (
        [switch]$verbose
    )
    PROCESS {
    }
}

La razón es no puede redefinir uno de los parámetros comunes como - detallado. ¿Cómo se puede saber si la función se ejecutó con - detallada o no? Bueno, parece que no sean necesarios. Windows PowerShell-Comandos Virtual Machine Manager realiza un seguimiento de él para usted. Basta con llamar a de Write-Verbose y Windows PowerShell-Comandos Virtual Machine Manager pasará por alto esas llamadas si - no se utilizó detallado:

function Test-Something {
    PROCESS {
        Write-Verbose "Starting cmdlet"
    }
}

test-something –verbose

Confirmación de impacto

Otro par de parámetros común es - whatif y - confirmar. Se supone que cualquier cmdlet que realice algún tipo de cambio para la Windows PowerShell-Comandos Virtual Machine Manager los reconoce. Ofrece la posibilidad de hacer que el cmdlet mostrar lo que lo haría normalmente (-whatif), o que individualmente cada acción de confirmación (- confirmar). Juntos, estos parámetros se denominan ShouldProcess, y se puede declarar una función que admite, como se muestra aquí:

function Delete-Things {
    [CmdletBinding(
        SupportsShouldProcess=$true,
        ConfirmImpact="Medium"
    )]
    PROCESS {
    }
}

Esta declaración habilita ambas - whatif y - confirmar como parámetros para la función. También especifica que la función tiene un nivel de impacto "Media" en el sistema operativo. No hay directrices estrictas para lo que significa "Medio", supongo que es algo inferior a la posibilidad de que un desastre total. El truco real es que variable de ConfirmPreference $ del shell, el valor predeterminado es "Alto". Cuando el impacto de un cmdlet es inferior a $ ConfirmPreference, a continuación, el cmdlet se ejecutará sin pedir confirmación a menos que - whatif o - confirmar se especifican.

Si impacto del cmdlet es igual o mayor que $ ConfirmPreference, a continuación, cada vez que ejecuta el cmdlet, actuará como si hubiera especificado - confirmar, incluso si ha olvidado hacerlo. Por lo tanto, si la función se va a hacer algo muy peligroso, de especificar un ConfirmImpact = "Alta" para el cmdlet siempre solicitará confirmación. Las demás opciones son "None" y "Low".

Ninguno de los de ayuda integrada de la shell realmente muestra cómo pedir confirmación, y no es automática. La ayuda se hace referencia a la ayuda MSDN en línea, que está destinada a desarrolladores de Windows PowerShell-Comandos Virtual Machine Manager .NET Framework y no hace referencia lenguaje de secuencias de comandos del shell en absoluto. Por lo tanto, le mostraré aquí:

function Delete-Things {
    [CmdletBinding(
        SupportsShouldProcess=$true,
        ConfirmImpact="High"
    )]
    Param ($param1)
    PROCESS {
        if ($pscmdlet.ShouldProcess($param1)) {
            Write "Deleting..."
        }
    }
}

Delete-Things "organizationalunit"

pscmdlet $ es una variable integrada que se pueden utilizar en el bloque de script PROCESS a la funcionalidad de nivel de cmdlet Windows PowerShell-Comandos Virtual Machine Manager, incluyendo el método ShouldProcess. Se pasa en una descripción de lo que va a modificar y el shell se tenga cuidado de mostrar la confirmación real o “ ¿qué ocurre si ” del mensaje.

Si ShouldProcess devuelve $ True, a continuación, le permite continuar. Si devuelve $ false, entonces no debería hacer todo lo que es que estaba intentando hacer. Una vez que sabe acerca de la variable de pscmdlet $, que hace la idea de los documentos de desarrolladores MSDN es más fácil. Describen con exactitud las distintas formas que se debe utilizar ShouldProcess y sus compañeros, como ShouldContinue.

Obtener ayuda. Obtener ayuda. Obtener ayuda.

No olvide que funciona, incluso avanzada a las: puede contener su propia ayuda integrada en los comentarios con un formato especial, como describí en mi columna marzo 2010 . Normalmente, la lista la Ayuda basada en el comentario en primer lugar, a continuación, la instrucción CmdletBinding, los parámetros y, a continuación el {} BEGIN, PROCESS {} y END scriptblocks {}. Es siempre una buena idea incluir ayuda dentro de sus funciones, nunca se sabe que puede beneficiarse de él.

Si ha escrito las funciones de canalización antes (también llamado “ filtrado funciones ”) y, después, ya sabe todo lo demás que necesita saber para escribir un cmdlet de secuencia de comandos de “. ” El bloque de script PROCESS {} es donde entra en el código y se ejecutará una vez para cada objeto canalizado en su cmdlet. Todos los demás acerca de estas funciones avanzadas de también es igual que sus equivalentes en algo más sencillos.

Windows PowerShell-Comandos Virtual Machine Manager v2 ya está disponible

Aunque incluido preinstalado con Windows PowerShell-Comandos Virtual Machine Manager Server 2008 R2 y Windows PowerShell-Comandos Virtual Machine Manager 7, Windows PowerShell-Comandos Virtual Machine Manager v2 y sus componentes de marco de administración de adjunto, ahora está disponible para XP Windows PowerShell-Comandos Virtual Machine Manager, Windows PowerShell-Comandos Virtual Machine Manager Server 2003, la vista de Windows PowerShell-Comandos Virtual Machine Manager y Windows PowerShell-Comandos Virtual Machine Manager Server 2008. Visite support.microsoft.com/kb/968929 de para obtener el vínculo de descarga para cualquier sistema operativo que esté utilizando. Debe ser compatible con las secuencias de comandos de la versión 1, y todas las columnas futuras se presupone que está utilizando 2.0.

Un intervalo de audiencias

El equipo de Windows PowerShell-Comandos Virtual Machine Manager rightly enorgullece de realizar Windows PowerShell-Comandos Virtual Machine Manager útiles para una amplia gama de audiencias con distintos niveles de dificultad. Las funciones avanzadas definitivamente son un ejemplo de algo que sólo una avanzada audiencia útil.

Si se está iniciando con el shell y se tiene que recordar que debe ejecutarse en de Ayuda, a continuación, las funciones avanzadas están probablemente aún desactivados en el futuro de. Puede utilizar correctamente el shell sin tener que escribir una función avanzada. Después de empezar a recibir más avanzada y empezar a escribir componentes reutilizables, encontrará que las funciones avanzadas son una excelente manera de hacerlo.

El blog registrar aquí es un buen ejemplo de esto: Comienza con un comando simple que realiza una tarea útil, algo que puede escribir cualquier administrador. A continuación, el autor gradualmente amplía la funcionalidad de su comando en una función, a continuación, una función de filtrado y, por último, una función avanzada, que se muestra cómo puede ampliar el shell como sus necesidades y aumentan las habilidades.

Don Jones es un fundador de la tecnología concentrado y preguntas de respuestas sobre Windows PowerShell-Comandos Virtual Machine Manager y otras tecnologías en ConcentratedTech.com. También es autor de Nexus.Realtimepublishers.com, lo que muchos de sus libros disponibles como ediciones electrónicas gratuitas.

Contenido relacionado

·      Windows PowerShell: PowerShell y Active Directory

·      Windows PowerShell: Filtrar por un lado, dar formato por otro

·      Windows PowerShell: No se levante de su asiento