Windows PowerShell : Créez une meilleure fonction

Les fonctions avancées de Windows PowerShell 2.0 vous permettent d'émuler des applets de commande natives avec un script relativement simple.

Don Jones

Dans Windows PowerShell 2.0, Microsoft a introduit un nouveau type de fonction appelée « fonction avancée ». Beaucoup de gens appellent cela une cmdlet « script ». L'idée avec ces fonctions est que vous pouvez maintenant utiliser le langage de script simplifié de Windows PowerShell pour créer quelque chose, works, est et semble presque identique à une applet de commande Windows PowerShell réel, natif.

Évidemment, certains d'entre vous vont être en mesure de créer des outils réutilisables pour vous-même et vos collègues. Toutefois, si vous créez des outils réutilisables, ces fonctions avancées sont la seule manière d'accéder. En fait, je suis en train de modifier mon cours de la classe pour animer uniquement ce type de fonction.

Parce que des fonctions avancées fonctionnent tellement tels que des applets de commande réel, une fonction correctement effectuée peut être plus facile d'emploi parce qu'il « tienne » dans la façon dont le reste des travaux de shell. Qui est le cas, ici un modèle que vous pouvez utiliser plus rapidement créer ces fonctions avancées :

function Get-Something {
  <#
  .SYNOPSIS
  Describe the function here
  .DESCRIPTION
  Describe the function in more detail
  .EXAMPLE
  Give an example of how to use it
  .EXAMPLE
  Give another example of how to use it
  .PARAMETER computername
  The computer name to query. Just one.
  .PARAMETER logname
  The name of a file to write failed computer names to. Defaults to errors.txt.
  #>
  [CmdletBinding()]
  param
  (
    [Parameter(Mandatory=$True,
    ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True,
      HelpMessage='What computer name would you like to target?')]
    [Alias('host')]
    [ValidateLength(3,30)]
    [string[]]$computername,
        
    [string]$logname = 'errors.txt'
  )

  begin {
  write-verbose "Deleting $logname"
    del $logname -ErrorActionSilentlyContinue
  }

  process {

    write-verbose "Beginning process loop"

    foreach ($computer in $computername) {
      Write-Verbose "Processing $computer"
      # use $computer to target a single computer
    

      # create a hashtable with your output info
      $info = @{
        'info1'=$value1;
        'info2'=$value2;
        'info3'=$value3;
        'info4'=$value4
      }
      Write-Output (New-Object –TypenamePSObject –Prop $info)
    }
  }
}

Il existe quelques points importants à noter concernant cette fonction, parmi lesquelles vous devrez tweak lors de l'utilisation de ce modèle :

  • Le nom de fonction doit ressembler à un nom de l'applet de commande, commençant avec l'un des verbes Windows PowerShell couramment utilisés comme « Get » et se terminant par un nom au singulier.
  • Renseignez l'aide de commentaire. Fournir une description de chaque paramètre, une description de la fonction globale et des exemples de son utilisation. Exécutez about_comment_based_help d'aide pour plus d'informations sur l'écriture d'aide de cette manière.
  • Le premier paramètre, Nom_Ordinateur $, est assez complexe. Il peut accepter une ou plusieurs valeurs du paramètre ou à partir du pipeline. Il accepte uniquement les valeurs sont de 3 à 30 caractères. Vous pouvez utiliser –host au lieu de –computername lors de l'exécution de la fonction. Ce paramètre est obligatoire. Si une personne exécute la fonction sans fournir un nom d'ordinateur, le shell vous invite à entrer un ou plusieurs.
  • Le deuxième paramètre, $logname, est un paramètre plus simple. Elle accepte uniquement une valeur de chaîne. Il possède également une valeur par défaut.
  • Le bloc de script BEGIN essaie de supprimer tous les fichiers journaux existants, afin que chaque exécution de la fonction a un fichier journal fraîches.
  • Dans le bloc de script PROCESS, je l'ai indiqué où vous pouvez utiliser la variable d'ordinateur $ pour que votre fonction fonctionne avec un seul ordinateur. Vous ne travaillez directement avec $NomOrdinateur. Ce paramètre peut contenir une ou plusieurs valeurs, afin que la boucle ForEach énumère les et place un seul à la fois en ordinateur $ pour vous.
  • La table de hachage $info doit contenir votre format de sortie souhaité. Considérez ceci comme sortie sous forme de tableau. J'ai créé des colonnes appelées info1, info2, produit3 et info4. Les valeurs de ces colonnes sont extraites les variables de valeurX $. C'est juste un exemple. Je n'ai pas mettent réellement rien dans ces variables dans ce modèle, vous pouvez remplacer $valeur1, valeur2 $, etc. avec vos propres informations.

Ce modèle est parfait pour toutes les fonctions avancées nécessaires pour obtenir des informations, mais pas réellement apporter des modifications à l'état du système. Pour les fonctions avancées qui modifie l'état du système, vous devez implémenter quelques éléments supplémentaires. Dans cette optique, voici un second modèle :

function Do-Something {
  <#
  .SYNOPSIS
  Describe the function here
  .DESCRIPTION
  Describe the function in more detail
  .EXAMPLE
  Give an example of how to use it
  .EXAMPLE
  Give another example of how to use it
  .PARAMETER computername
  The computer name to query. Just one.
  .PARAMETER logname
  The name of a file to write failed computer names to. Defaults to errors.txt.
  #>
  [CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='Low')]
  param
  (
    [Parameter(Mandatory=$True,
    ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True,
      HelpMessage='What computer name would you like to target?')]
    [Alias('host')]
    [ValidateLength(3,30)]
    [string[]]$computername,
        
    [string]$logname = 'errors.txt'
  )

  begin {
  write-verbose "Deleting $logname"
    del $logname -ErrorActionSilentlyContinue
  }

  process {

    write-verbose "Beginning process loop"

    foreach ($computer in $computername) {
      Write-Verbose "Processing $computer"
      if ($pscmdlet.ShouldProcess($computer)) {
        # use $computer here
      }
    }
  }
}

Dans ce modèle, vous devez modifier le paramètre « ConfirmImpact ». Vous devez donner une indication relative du danger potentiel de votre fonction avancée. Par exemple, faire quelque chose de mineurs tels que la modification de l'attribut d'un fichier en lecture seule peut évaluer une ConfirmImpact de « Faible ». Redémarrage de l'ordinateur peut être un ConfirmImpact de « Élevée ». Windows PowerShell utilise ce paramètre, avec la variable de ConfirmPreference $ intégré du shell, pour déterminer s'il faut fournir automatiquement à l'écran « Êtes-vous? » lorsque vous exécutez la fonction.

Il a noté où vous devez réellement effectuer votre action, à l'aide d'ordinateur $ pour cibler un seul ordinateur. Qui est encapsulé dans une construction « If », qui utilise l'objet de pscmdlet $ intégré. Si cette fonction est exécutée avec les paramètres – Confirm ou WhatIf (qui prendra en charge), l'objet de pscmdlet $ s'occupera de produire la sortie « what if » ou en générant les invites « Etes-vous sûr (e)? ».

Ces deux modèles seront également prendre en charge le paramètre – a et utilisez Write-Verbose pour générer des messages d'état pendant l'exécution de la fonction. À l'évidence, pas toutes les fonctions devra ordinateurs cibles. Vous souhaiterez parfois, des paramètres pour accepter les noms de fichiers, les noms d'utilisateur ou d'autres informations. Il suffit de modifier les déclarations de paramètre correctement.

Vous trouverez plus d'informations sur les attributs du paramètre — telles que la validation, obligatoire, de pipeline d'entrée, etc. — en exécutant aide about_functions_advanced_parameter dans le shell. Bonne chance !

Don Jones

Don Jonesest un auteur, trainer et orateur Windows PowerShell populaires. Son dernier livre est au "en savoir plus Windows PowerShell dans un mois de déjeuner » (Manning, 2011) ; visitez MoreLunches.com d'infos et le guide gratuit de contenu. Il est également disponible pour les classes de formation sur site (reportez-vous au ConcentratedTech.com/training pour plus d'informations).

Contenu associé