Windows PowerShell : Écriture d'applets de commande dans des scripts

Don Jones

Une des nouvelles fonctionnalités sympas de Windows PowerShell-Interface de commande Virtual Machine Manager v2 est la possibilité d'écrire des fonctions nettement améliorées. Ces fonctions, écrites entièrement en script, possèdent les mêmes fonctionnalités qu'une cmdlet “ réelle ” écrit en c# ou Visual Basic et compilées dans Visual Studio. Ces fonctions avancées de (they were originally called “script cmdlets” early in the v2 development cycle) vous écrivez des fonctions plus flexibles vous pouvez ensuite utiliser en toute transparence à côté des applets de commande standard.

Il est tout dans la liaison

La différence entre une fonction simple et une applet de commande complet réelle est qu'applets de commande prend en charge les liaisons des paramètres puissant. Vous pouvez utiliser les paramètres positionnels, appelées paramètres, paramètres obligatoires et faire même des contrôles de la validation de paramètre de base, tout en décrivant simplement le paramètre à l'interpréteur de commandes. Voici un exemple :

Annuler vos propres modules

Quelle est cette aide vous distribuez vos scripts plus facilement ? Le deuxième type de module, un module de script de , est la réponse. Il s'agit tout simplement un script Windows PowerShell-Interface de commande Virtual Machine Manager normal, avec une extension de nom de fichier .psm1 plutôt que l'extension de nom de fichier. ps1 habituelle. Placer mymodule.psm1 dans le dossier \modules permet d'exécuter le Import Module MyModule , et votre script s'exécutera.

En règle générale, un module de script compose de entièrement de fonctions. Autrement dit, lorsque le module est importé, rien n'en fait exécute, les fonctions du module de script sont chargées dans l'interpréteur de commandes et sont disponibles tout au long de l'interpréteur de commandes. Supposons que vous disposez d'un module de script qui ressemble à ceci :

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 {
    }
}

Dans cette instruction, j'ai déclaré trois paramètres :

  • nom d'ordinateur est une chaîne unique ou un tableau de chaînes. Il est obligatoire et qu'il accepte des entrées de pipeline de chaîne, ce qui signifie que si vous barre verticale dans un ensemble de chaînes, qu'elles allez être automatiquement supprimées dans la variable de nom d'ordinateur $.
  • pingfirst n'est pas obligatoire, mais si vous l'utilisez, vous devez utiliser l'option - alias de dossier public. Il enregistre un peu de saisie. Il s'agit d'un paramètre de commutateur, ce qui signifie qu'il n'accepte pas une valeur. Il est soit activé ou désactivé.
  • classe est également obligatoire, mais vous Don ’t même pas à taper-nom de paramètre de la classe. Venez lui donner la valeur appropriée en tant que la valeur de la première position lorsque vous exécutez la fonction. Bien que cela soit obligatoire, il accepte une chaîne vide.

Il n'y a beaucoup d'autres attributs et beaucoup d'exemples, dans l'aide en ligne. Exécutez aider about_Functions_Advanced_Parameters pour tous les voir.

Pour accéder aux paramètres communs

Le shell définit plusieurs paramètres communs partagés par toutes les cmdlets. L'un d'eux est de-avec commentaires, qui est destiné à indiquer une cmdlet pour plus d'informations que d'habitude sur ce qu'il fait de sortie. La définition de fonction suivant, toutefois, entraînent une Windows PowerShell-Interface de commande Virtual Machine Manager :

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

C'est parce que vous ne pouvez pas redéfinir l'un des paramètres communs tels que - avec commentaires. Par conséquent, comment savoir si votre fonction a été exécutée avec l'option - détaillée ou pas ? Hé bien, il s'avère être inutiles. Windows PowerShell-Interface de commande Virtual Machine Manager assure le suivi des il pour vous. De Write-Verbose, appelez simplement et Windows PowerShell-Interface de commande Virtual Machine Manager ignore ces appels si - verbose n'a pas été utilisés :

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

test-something –verbose

Confirmation d'impact

Une autre paire de paramètres communs est de-whatif et - confirmer. Une applet de commande qui soit un type de modification pour le Windows PowerShell-Interface de commande Virtual Machine Manager est supposée de reconnaître ceux. Ils vous donnent la possibilité de l'applet de commande dont l'affichage est ce qu'il devrait faire normalement (-whatif), ou lui faire individuellement chaque action de confirmation (- Confirmer). Ensemble, ces paramètres sont appelés ShouldProcess, et vous pouvez déclarer une fonction qui prend en charge, comme illustré ici :

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

Cette déclaration permet à la fois - whatif et - confirmer en tant que paramètres de votre fonction. Il spécifie également que votre fonction est un niveau d'impact «Moyen» sur le système d'exploitation. Il n'y a pas d'instructions strictes pour ce que signifie «Moyen», je serait imaginer qu'il est inférieure à la possibilité pour total après sinistre. L'astuce réel est que $ ConfirmPreference variable de l'interpréteur de commandes par défaut est «Élevée». Lors de l'impact d'une cmdlet est inférieure à $ ConfirmPreference, puis l'applet de commande s'exécute sans confirmation à moins que - whatif ou - confirmer sont spécifiés.

Si l'impact de l'applet de commande est supérieur ou égal à celui ConfirmPreference $, puis chaque fois que vous exécutez la cmdlet, elle agit comme si vous aviez spécifié - confirmer, même si vous avez oublié de le faire. Par conséquent, si votre fonction est prêt à faire quelque chose de très dangereux, spécifier un ConfirmImpact = "Élevé" afin que votre applet de commande sera toujours demander confirmation. Vos autres choix est «None» et «Low».

Aucune aide intégrée de l'interpréteur de commandes en réalité montre comment demander confirmation, et il n'est pas automatique. L'aide vous fait référence à l'aide MSDN en ligne, qui est destiné aux développeurs de Windows PowerShell-Interface de commande Virtual Machine Manager .NET Framework et n'a pas de référence à tout langage de script de l'interpréteur de commandes. Par conséquent, je vous montrerai ici :

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

Delete-Things "organizationalunit"

pscmdlet $ est une variable prédéfinie, vous pouvez utiliser dans le bloc de script PROCESS aux fonctionnalités de niveau de la cmdlet Windows PowerShell-Interface de commande Virtual Machine Manager — y compris la méthode ShouldProcess. Vous transmettez une description de ce que vous êtes prêt à modifier, et le shell va prendre en charge d'afficher la confirmation réelle ou “ que se passe-t-il si ” de message.

Si $ ShouldProcess renvoie la valeur True, puis vous permet de continuer. Si elle renvoie la valeur $ False, puis que vous ne devez pas faire tout ce que c'est vous deviez faire. Une fois que vous savez sur la variable de pscmdlet $, qui effectue la détection de ces documents de développeur MSDN est plus facile. Elles décrivent avec précision les différentes façons, vous devez utiliser ShouldProcess et ses Compagnons, tels que ShouldContinue.

Aide ! Aide ! Aide !

N'oubliez pas que les fonctions — même avancées celles — peuvent contenir des leur propre aide intégrée dans les commentaires de mise en forme spéciale, que j'ai décrit dans mon 2010 mars colonne . En règle générale, je l'aide de commentaire début de liste, puis l'instruction CmdletBinding, mes paramètres, puis le {BEGIN}, {} le PROCESS et END scriptblocks {}. Il est toujours judicieux d'inclure l'aide dans vos fonctions, vous ne savez jamais qui tire parti de ce dernier.

Si vous avez écrit du pipeline fonctionne avant (également appelé “ fonctions de filtrage ”), puis que vous connaissez déjà tout le reste que vous devez connaître afin d'écrire une cmdlet “ script ”. Le bloc de script PROCESS {} est l'endroit où votre code se place et il sera exécuté une fois pour chaque objet transmis dans votre applet de commande. Toutes les autres à propos de ces avancées des fonctions sont également la même manière que leurs homologues un peu plus simples.

Windows PowerShell-Interface de commande Virtual Machine Manager v2 est maintenant disponible

Bien qu'il a été livré préinstallé avec Windows PowerShell-Interface de commande Virtual Machine Manager Server 2008 R2 et Windows PowerShell-Interface de commande Virtual Machine Manager 7, Windows PowerShell-Interface de commande Virtual Machine Manager v2 et de ses composants d'infrastructure de gestion associé, est désormais disponible pour XP Windows PowerShell-Interface de commande Virtual Machine Manager, Windows PowerShell-Interface de commande Virtual Machine Manager Server 2003, Vista Windows PowerShell-Interface de commande Virtual Machine Manager et Windows PowerShell-Interface de commande Virtual Machine Manager Server 2008. Visitez le site de support.microsoft.com/kb/968929 pour obtenir le lien de téléchargement pour les système d'exploitation que vous utilisez. Ce doit être compatible avec vos scripts de version 1 et tous mes futurs articles suppose que vous utilisez 2.0.

Une plage d'audiences

L'équipe Windows PowerShell-Interface de commande Virtual Machine Manager juste titre fier que Windows PowerShell-Interface de commande Virtual Machine Manager utile à un large éventail de publics avec différents niveaux de compétence. Fonctions avancées sont sans aucun doute un exemple d'un élément uniquement une audience Avancé de utiles.

Si vous vous veniez de débuter avec l'interpréteur de commandes et que vous disposez pour vous rappeler d'exécuter le aide , des fonctions avancées sont sans doute toujours éteint à l'avenir. Vous pouvez utiliser avec succès de l'interpréteur de commandes sans jamais écrire une fonction avancée. Une fois que vous démarrez l'obtention de plus avancées et que vous commencez à écrire des composants réutilisables, vous trouverez que les fonctions avancées sont un excellent moyen de le faire.

Le billet de blog ici est un bon exemple de ceci : Il commence par une commande simple qui effectue une tâche utile : quelque chose de n'importe quel administrateur peut écrire. Ensuite, l'auteur développe progressivement des fonctionnalités de la commande de son dans une fonction, puis une fonction de filtrage et, enfin, une fonction avancée, illustrant la façon dont le shell peut être redimensionné en tant que vos besoins et développer des compétences.

Don Jones est le fondateur de concentré de technologie et les réponses aux questions sur Windows PowerShell-Interface de commande Virtual Machine Manager et d'autres technologies à ConcentratedTech.com. Il est également un auteur de Nexus.Realtimepublishers.com, qui rend un grand nombre de ses livres disponibles en éditions électroniques gratuites.

Contenu associé

·      Windows PowerShell : PowerShell et Active Directory

·      Windows PowerShell : Filtre à gauche, Mise en forme à droite

·      Windows PowerShell : Restez assis !