Windows PowerShell : Cours intensif de script

Cet article détaillé sur Windows PowerShell vous permettra d'acquérir des notions de base sur cette puissante technologie.

Don Jones

Plus de vous sont à Windows PowerShell et réalisation de ses avantages.Dans cette optique, mois-ci ce va être long.Il s'agit d'une présentation éclair de Windows PowerShell de script, y compris comment générer les scripts paramétrés.Dans les prochains mois, je vais me concentrer sur des sujets spécifiques qui s'appuient sur cette base.

Si vous n'êtes pas utilisé pour l'exécution de commandes Windows PowerShell dans la console, vous pourriez trouver cette trop avancée mais tentent de lire via malgré tout.Vous devez disposer d'une connaissance approfondie des fonctions de sécurité Windows PowerShell.Vous devez déjà connaître à propos de la stratégie d'exécution et savez quel paramètre vous utilisez.Si vous ne connaissez pas déjà la différence entre « RemoteSigned » et « AllSigned » et pourquoi un peut être préférable à l'autre, vous ne serez peut-être pas prêt pour le matériel suivant.

Vous devez également savoir comment exécuter des scripts dans le shell et devez rappeler que vous devez toujours fournir un chemin d'accès et nom de fichier pour exécuter un script.Enfin, vous devez également connaître la différence entre l'exécution d'un script dans la console et le Integrated Scripting Environment (ISE).Dans le salon ISE, exécuter des scripts dans la portée globale.Dans la console shell normal, scripts obtenir leur propre étendue.Je passerai en revue étendue, mais vous disposez déjà d'une idée de sa signification et ce qu'il fait.

Si vous avez l'impression pas tout à fait opérationnel, regardez mon livre, "En savoir plus Windows PowerShell dans un mois au déjeuner» (Manning Publications, 2011) et le le Guide Web site et voir si ces ressources peuvent vous aider à créer de meilleures bases.

Essayez de suivre lorsque vous lisez cette colonne.Essayez les exemples.Si vous tapez (ou copiez et collez) les exemples de script dans l'ISE Windows PowerShell partir de la ligne 1, les numéros de ligne doit correspondre avec les numéros de ligne dans les descriptions.

Fichiers de Script de Windows PowerShell

Un fichier de script Windows PowerShell n'est rien de plus qu'un fichier texte brut qui a un.Extension de nom de fichier ps1.« 1 » Ne fait pas référence à la version de Windows PowerShell, mais plutôt la version du moteur de langue.Windows PowerShell version 1 et 2 utilisent la version de moteur de langue 1.C'est pourquoi les deux versions de la coque sont installées dans un dossier v1.0 sous \Windows\System32\WindowsPowerShell.

Un script de Windows PowerShell n'est pas exactement comme un fichier de commandes de ligne de commande et exécuter un script est précisément différent de celui exécutant les mêmes commandes dans le même ordre.Par exemple, ouvrez une fenêtre de console et exécutez la commande suivante, en appuyant sur ENTRÉE après chaque ligne (n'oubliez pas de ne pas à taper les numéros de ligne) :

Get-Service
Get-Process

Tapez maintenant ces mêmes lignes exacts dans un fichier de script ou le script ISE volet d'édition et exécutez le script. Vous obtiendrez des résultats de recherche différents. Chaque fois que vous appuyez sur entrée dans Windows PowerShell, vous démarrez un nouveau pipeline. Ajouter les commandes que vous avez tapé sont exécutées dans ce pipeline unique. À la fin du pipeline, Windows PowerShell convertit son contenu dans un affichage de texte. Lorsque vous exécutez les deux commandes dans la console normale, vous avez fait dans deux canalisations distinctes.

Windows PowerShell a été en mesure de construire un affichage unique pour chaque ensemble de sortie. Lorsque des entrées dans un script, toutefois, ces deux commandes exécuté dans le même tuyau. La Windows PowerShell système de mise en forme n'est pas sophistiquée suffisamment pour construire la même unique sortie pour deux différents ensembles de résultats. Essayez d'exécuter ceci dans la console :

Get-Service;Get-Process

Ces résultats doivent avoir la même apparence comme ils le faisaient lorsque vous avez exécuté le script contenant ces deux commandes. Dans ce cas, les deux commandes est exécuté dans une canalisation unique. C'est ce que s'est-il passé lorsque vous avez exécuté le script.

Le résultat pratique de tout cela est qu'un script doit produire qu'un seul type de sortie. Il est dûment une mauvaise idée, en grande partie sur les limitations du système de mise en forme. Il existe des autres considérations. Vous ne souhaitez pas un script dumping plusieurs sortes de choses dans le pipeline en même temps.

Concentrez-vous sur qui en règle générale pour tout ce dont nous traiterons. Un script doit générer un et qu'un seul type de sortie. La seule exception serait si elle est un script utilisé comme référentiel pour plusieurs fonctions. Dans ce cas, chaque fonction doit générer un et qu'un seul type de sortie.

Variables

Considérer comme une zone de variables. Vous pouvez placer un ou plusieurs éléments, même les choses dissemblables, dans cette zone. La zone possède un nom et dans Windows PowerShell ce nom peut comprendre presque tous les éléments. « Var » peut être un nom de variable, comme can « {ma variable} ». Dans ce second exemple, les accolades délimitent un nom de variable qui contient des espaces, qui est assez laid. Comme une bonne pratique stick avec les noms de variables qui incluent des lettres, chiffres et des traits de soulignement.

À l'aide du nom d'une variable fait référence à l'intégralité de la « zone ». Si vous souhaitez faire référence au contenu de la zone, ajoutez un signe dollar: $var. Vous verrez souvent variables Windows PowerShell précédés par le signe dollar, car le but d'utiliser l'une consiste à accéder au contenu. Il est important de se rappeler, toutefois, que le signe dollar ne fait pas partie du nom de la variable. Il est simplement un repère pour indiquer que vous souhaitez que le contenu plutôt que la zone elle-même à Windows PowerShell. Par exemple :

$var = 'hello'
$number = 1
$numbers = 1,2,3,4,5,6,7,8,9

Ces exemples montrent comment placer des éléments dans une variable à l'aide de l'opérateur d'assignation (=). Ce dernier exemple crée un tableau, car Windows PowerShell interprète toutes les listes séparées par des virgules comme un tableau ou une collection d'éléments. Le premier exemple assigne un objet chaîne, avec les caractères dans la chaîne entre guillemets.

Il existe un aspect de Windows PowerShell qui peut désorienter les nouveaux arrivants. Windows PowerShell ne « comprendre » n'importe quel sens que vous pouvez associer à un nom de variable. Une variable $NomOrdinateur ne « dire » l'interpréteur de commandes contenant un nom d'ordinateur dans la variable.

De même, les numéros de $ ne « dire » l'interpréteur de commandes contenant plusieurs numéros dans une variable. Le shell, peu importe si vous utilisez un nom de variable au pluriel. L'instruction

$numbers = 1

sont également valables pour le shell est

$numbers = 'fred.'

Toutefois, lorsqu'une variable contient-elle plusieurs valeurs, vous pouvez utiliser une syntaxe spéciale pour accéder à un seul d'entre eux. Vous devez utiliser des numéros $[0] comme le premier élément, numéros $[1] sont la seconde, numéros $-[1] sont la dernière, numéros $-[2] sont l'avant-dernier et ainsi de suite.

Guillemets

Comme les meilleures pratiques, utilisez des guillemets simples pour délimiter une variable, sauf si vous avez une raison spécifique de faire autrement. Il existe trois instances spécifiques où vous souhaiteriez utiliser des guillemets doubles.

Le premier est lorsque vous avez besoin insérer le contenu d'une variable dans une chaîne. Au sein de guillemets doubles, Windows PowerShell recherchera le $ et suppose que tout ce qui suit le $ jusqu'au premier caractère qui n'est pas conforme dans un nom de variable est un nom de variable. Le contenu de cette variable va remplacer le nom de variable et les $:

$name = 'Don'
$prompt = "My name is $name"

L'invite $ contiendra désormais « mon nom est Don », car $nom sera remplacé par le contenu des variables. Il s'agit d'une excellente astuce permettant de joindre les chaînes sans avoir à les concaténer.

Guillemets doubles, Windows PowerShell sera également rechercher son caractère d'échappement, les backtick ou accent grave et agir en conséquence. Voici quelques exemples :

$debug = "`$computer contains $computer"
$head = "Column`tColumn`tColumn"

Dans le premier exemple, le premier $ est « échappement. » Qui supprime sa signification spéciale en tant qu'un accesseur variable. Si l'ordinateur $ contenus « SERVER », puis débogage $ contiendrait « ordinateur $ contient le serveur ».

Dans le deuxième exemple, ' t représente un caractère de tabulation horizontale, Windows PowerShell placera une tabulation entre chaque colonne. Vous pouvez lire sur les autres caractères spéciaux d'échappement dans le shell about_escape_characters rubrique d'aide.

Enfin, utilisez des guillemets doubles lorsqu'une chaîne doit contenir des guillemets simples :

$filter1 = "name='BITS'"
$computer = 'BITS'
$filter2 = "name='$computer'"

Dans cet exemple, la chaîne littérale est nom = « BITS ». Les guillemets doubles contient l'intégralité. Filter1 $ et $filter2 finissent contenant exactement la même chose mais $filter2 arrive à l'aide de l'astuce de remplacement de la variable de guillemets doubles. Notez que que le jeu de plus à l'extérieur des devis questions. Les guillemets simples au sein de la chaîne n'a d'importance à Windows PowerShell. Ces guillemets simples sont des caractères littéraux uniquement. Windows PowerShell n'interprète pas les.

Les variables et les membres de l'objet

Tous les éléments de Windows PowerShell sont un objet. Même une simple chaîne telle que « nom » est un objet du type System.String. Vous pouvez rediriger n'importe quel objet à Get-Member pour voir le nom de son type (type d'objet) ainsi que ses membres, y compris ses propriétés et méthodes :

$var = 'Hello'
$var | Get-Member

Utiliser un point après le nom de variable pour indiquer le shell, « je ne souhaite accéder à l'objet entier au sein de cette variable. Je veux accéder à un seul de ses propriétés ou méthodes. » Après la période, indiquez le nom de propriété ou méthode.

Noms de méthode sont toujours suivis d'un jeu de parenthèses. Certaines méthodes acceptent des arguments d'entrée et ceux atteindre entre parenthèses dans une liste séparée par des virgules. D'autres méthodes ne requièrent pas d'arguments, et donc les parenthèses sont vides, mais n'oublient pas les parenthèses :

$svc = Get-Service
$svc[0].
name
$name = $svc[1].
name
$name.length
$name.ToUpper()

Notez la ligne deux. Il démarre en accédant au premier élément dans la variable de svc $. Les moyens de périodes, « je ne veux pas la totalité de cet objet. Je voudrais juste une propriété ou méthode. » Cette commande ouvre simplement la propriété name. Ligne cinq illustre comment accéder à une méthode, en fournissant son nom après une période, suivie de parenthèses.

Une période est normalement un caractère non autorisé au sein d'un nom de variable, car la période signifie que nous souhaitons accéder à une propriété ou méthode. Cela signifie que la ligne deux dans l'exemple suivant ne fonctionnera pas comme prévu peut :

$service = 'bits'
$name = "Service is $service.ToUpper()"
$upper = $name.ToUpper()
$name = "Service is $upper"

Sur la ligne deux, $nom contient « Service est de BITS.ToUpper()" considérant que, à la ligne quatre $nom contient « Service est BITS ».

Parenthèses

En dehors de leur utilisation avec des méthodes de l'objet, entre parenthèses également agissent comme une marque d'ordre d'exécution pour Windows PowerShell, tout comme dans l'algèbre. En d'autres termes, entre parenthèses indiquent l'interpréteur de commandes « exécuter ce premier ». L'ensemble de l'expression entre parenthèses est remplacé par ce qui génère cette expression. Voici quelques exemples paradigmatique :

$name = (Get-Service)[0].
name
Get-Service -computerName (Get-Content names.txt)

Sur la ligne, $name contient le nom du premier service sur le système. Lisez ceci nécessite un peu d'effort. Démarrer avec l'expression entre parenthèses. C'est ce que Windows PowerShell commence par ainsi. « Get-Service » correspond à une collection ou tableau des services. [0] Accède le premier élément dans un tableau, donc qui sera le premier service. Dans la mesure où elle est suivie d'une période, nous savons que nous allons accéder à une propriété ou méthode de ce service, plutôt que l'objet de l'ensemble du service. Enfin, nous extraire uniquement le nom du service.

Sur la ligne deux, l'expression entre parenthèses lit le contenu d'un fichier texte. En supposant que le fichier contient un nom d'ordinateur par ligne, « Get-Content » « retournera un tableau de noms d'ordinateur. Ceux sont chargées pour le paramètre de «-» ComputerName de « Get-Service ». Dans ce cas, le shell peut alimenter une expression entre parenthèses retourne un tableau de chaînes à la
paramètre de «-COMPUTERNAME », car le paramètre est conçu pour accepter les tableaux de chaînes.

Étendue

Étendue est un concept de programmation qui agit comme un système de conteneurisation. Éléments tels que les variables, alias, PSDrives et autres éléments Windows PowerShell sont stockées dans une portée. Le shell conserve une hiérarchie d'étendues et possède un ensemble de règles qui déterminent comment les étendues peuvent interagir et partager des informations avec eux.

L'interpréteur de commandes est une portée unique, appelée la portée globale. Lorsque vous exécutez un script, il construit une nouvelle étendue et dans laquelle l'exécution du script. Ceux créés par le script, comme une nouvelle variable est stockée dans la portée du script. Il n'est pas accessible par le shell de niveau supérieur.

Lorsque le script de fin de l'exécution, sa portée est ignorée et quoi que ce soit créée dans cette portée disparaît. Par exemple, créer un script qui contient les éléments suivants (n'oubliez ne pas de taper les numéros de ligne), puis exécutez ce script à partir de la fenêtre de console :

New-PSDrive -PSProvider FileSystem -Root C:\ -Name Sys
Dir SYS:

Après avoir exécuté le script, exécutez manuellement "Dir SYS: « et vous devriez voir une erreur. C'est parce que la table système SYS : lecteur a été créé dans le script. Une fois le script a été effectué, tout ce dont il créé a été rejeté. SYS : lecteur n'existe plus. Pas tous les éléments de la coque sont portée. Éléments tels que les modules sont gérés globalement à tout moment. Un script peut charger un module et le module restera chargé lorsque le script est terminé.

Si une portée tente d'accéder à un élément qui n'a pas été créé dans cette portée, Windows PowerShell ressemble à l'étendue immédiatement supérieure (la portée « parent »). C'est pourquoi le Dir alias a travaillé dans la mesure où l'entrée de script que vous venez. Bien que Dir n'existe pas dans la portée du script, il n'existait pas dans le cadre supérieur suivant : la portée globale. Une étendue est libre de créer un élément qui a le même nom qu'un élément à partir d'une portée de niveau supérieur, cependant. Voici un autre script à essayer :

Dir
New-Alias Dir Get-Alias
Dir

Qui peut paraître étrange, mais la première fois qu'elle s'est déroulée « Dir », il n'existe pas dans la portée du script. Il permet l'alias Dir de niveau supérieur. Cet alias pointe sur Get-ChildItem, afin qu'il affiche une liste de répertoires familier.

Ensuite, le script crée un nouvel alias nommé dir. Cette pointe vers l'Alias de Get. C'est ce qui a été exécuté la deuxième fois. Aucune de ces affecté l'alias Dir de niveau supérieur. Essayez d'exécuter Dir dans le shell après avoir exécuté le script précédent, et vous aurez toujours une liste de répertoires.

Portée peut prêter à confuse en particulier lorsqu'il s'agit de variables. En règle générale, une étendue donnée ne doit jamais accéder aux éléments hors de portée, en particulier les variables. Il existe une syntaxe pour ce faire, comme l'utilisation de $global : var force accéder à $var variable l'étendue globale, mais qui est une mauvaise pratique, sauf dans des circonstances très spécifiques.

Langage de script Windows PowerShell

Windows PowerShell contient un langage de script très simplifié de moins de deux douzaines mots-clés. Il s'agit d'un contraste fortement avec un langage de programmation complet tel que VBScript, qui contient presque 300 mots clés.

Bien qu'il soit plus simple, le langage Windows PowerShell est plus que suffisant pour faire le travail. Je passerai en revue ses constructions de scripts principales maintenant, bien que vous pouvez toujours obtenir plus d'informations sur ces en lisant appropriée « sujet » dans le shell. Par exemple, vous about_switchcontains d'informations sur la construction de commutateur, tandis qu'about_if d'aide contient des informations sur la si construire. Exécuter l'aide sur * pour obtenir une liste de toutes les rubriques « à propos de ».

Construire la si

Il s'agit de la construction de prise de décision principale Windows PowerShell. Dans sa forme complète, il ressemble à ceci :

If ($this -eq $that) {
  # commands
} elseif ($those -ne $them) {
  # commands
} elseif ($we -gt $they) {
  # commands
} else {
  # commands
}

Le mot-clé « If » est une partie obligatoire de cette construction. Une expression entre parenthèses suit doit correspondre à True ou False. Windows PowerShell interprète toujours zéro comme valeur False et toute valeur différente de zéro comme valeur True.

Windows PowerShell reconnaît également les variables intégrées $True et False $ comme représentant ces valeurs booléennes. Si l'expression entre parenthèses correspond à True, les commandes dans le jeu suivant d'accolades exécutera. Si l'expression est False, les commandes ne sont pas exécutées. C'est tout ce que vous devez valide si construire.

Vous pouvez aller plus loin en fournissant une ou plusieurs sections « ElseIf ». Ces travaux de la même façon que si de construire. Ils obtiennent leur propre expression entre parenthèses. Si elle a la valeur True, les commandes dans les accolades suivants seront exécute. Si ce n'est pas le cas, ils ne sont pas.

Vous pouvez empaqueter avec un bloc Else qui s'exécutera si aucune des blocs précédents exécutée. Seul le bloc associé à la première expression True sera exécutée. Par exemple, si $cela ne faisait pas égal à $, et $ceux s'est pas égal à $, puis les commandes de ligne quatre exécuterait — et rien d'autre. Windows PowerShell même n'évalue pas la deuxième expression elseif sur la ligne 5.

Le caractère # est un caractère de commentaire, faire Windows PowerShell essentiellement ignorent les éléments à partir de là jusqu'à un chariot retour. Notez également le soin avec lequel ces constructions ont été mis en forme. Mise en forme comme suit à partir de certaines personnes peuvent également apparaître :

Peu importe l'endroit où vous placez les accolades. Toutefois, ce qui est important est que vous être cohérent dans votre placement afin que vos scripts sont plus faciles à lire. Il est également important de mettre en retrait, au même niveau, chaque ligne dans les accolades.

L'ISE Windows PowerShell vous permet d'utiliser la touche Tab à cet effet, et il prend par défaut pour un retrait de quatre caractères. Mise en retrait de votre code est une bonne pratique de cœur. Si vous ne le faites pas, vous aurez un temps tough correctement mise en correspondance ouvrantes et fermantes entre accolades dans les scripts complexes. En outre, tous les autres enfants Windows PowerShell fera plaisir de vous. Examinez ce script mal formaté :

function mine {
if ($this -eq $that){
get-service
}}

C'est beaucoup plus difficile à lire, déboguer, dépanner et à gérer. Tandis que l'espace après la parenthèse de fermeture n'est pas nécessaire, il rend plus facile à lire votre script. Le code en retrait n'est pas nécessaire, mais il facilite votre script à suivre. Pensez à la place :

function mine {
 if ($this -eq $that){
  get-service
 }
}

Placer une accolade fermante unique sur une ligne par elle-même n'est pas requis par le shell, mais il est apprécié par l'oeil humain. Être un formateur clair, et vous aurez moins de problèmes dans vos scripts.

Le Do While construction

Il s'agit d'une construction de boucle dans Windows PowerShell. Il est conçu pour répéter un bloc de commandes comme une condition a la valeur True ou jusqu'à ce qu'une condition devienne True. Voici l'utilisation de la base :

Do {
  # commands
} While ($this -eq $that)

Dans cette variante de la construction, les commandes dans les accolades seront exécutera toujours au moins une fois. While condition n'est pas évaluée qu'après la première exécution. Vous pouvez déplacer While, auquel cas les commandes seront exécute uniquement si la condition est vraie en premier lieu :

While (Test-Path $path) {
  # commands
}

Notez le second exemple n'utilise pas un opérateur de comparaison tel que - ég. C'est parce que l'applet de commande Test-chemin d'accès se produit pour retourner True ou False dans un premier temps. Il est inutile de comparer que True ou False pour que l'expression fonctionne.

L'expression entre parenthèses utilisée avec ces constructions scripts simplement doit simplifier à True ou False. Si vous utilisez une commande telle que le chemin d'accès de Test, qui renvoie toujours True ou False, qui vous est nécessaire. Comme toujours, est une rubrique « à propos de » dans le shell qui montre les autres façons d'utiliser cette construction.

La construction ForEach

Cette construction est similaire dans l'opération à la cmdlet ForEach-Object. Il diffère uniquement dans sa syntaxe. ForEach vise à prendre un tableau (ou une collection qui est identique à un tableau dans Windows PowerShell) et énumérer les objets dans le tableau afin de pouvoir travailler avec un à la fois :

$services = Get-Service
ForEach ($service in $services) {
  $service.Stop()
}

Il est facile pour les nouveaux arrivants à overthink cette construction. Gardez à l'esprit que le pluriel mot anglais « services » ne signifie rien à Windows PowerShell. Ce nom de variable est utilisé pour nous rappeler qu'il contient un ou plusieurs services. Simplement parce qu'il est au pluriel ne rend le shell se comportent de manière spéciale.

Le mot-clé « in » sur la ligne deux fait partie de la syntaxe ForEach. La variable de service $ est constituée. Il aurait aussi bien pu $café fred ou $ et qu'il aurait fonctionné dans la même façon.

Windows PowerShell Répétez les commandes de la construction — ceux qui sont contenus dans des accolades — une fois pour chaque objet dans la deuxième variable (services$). Chaque fois, elle prend un seul objet à partir de la deuxième variable (services$) et placer dans la première variable (service$).

Dans cette construction, utilisez la première variable (service$) pour travailler avec un objet individuel. Sur la ligne 3, la période indique "ne souhaitez pas utiliser l'objet tout simplement un de ses membres, la méthode Stop. »

Il existe parfois à l'aide de ForEach est inévitable et souhaitable. Toutefois, si vous avez un peu de programmation ou d'expérience de script, vous pouvez parfois leap à l'aide de ForEach lorsqu'il n'est pas la meilleure approche. L'exemple précédent n'est pas une bonne raison d'utiliser ForEach. Cela serait plus facile :

Get-Service | Stop-Service

Le point ici consiste à évaluer votre utilisation de ForEach. Assurez-vous qu'il est le seul moyen d'accomplir la tâche en cours. Voici certaines instances où ForEach est probablement la seule manière d'accéder :

  • Lorsque vous avez besoin exécuter une méthode par rapport à un ensemble d'objets et qu'il n'y a aucune applet de commande qui exécute l'action équivalente.
  • Lorsque vous possédez de nombreux objets et devez effectuer plusieurs actions consécutives contre chacun.
  • Lorsque vous disposez d'une action ne peut être effectuée que par rapport à un objet à la fois, mais votre script peut travailler avec un ou plusieurs objets et vous n'avez aucun moyen de savoir à l'avance.

Autres constructions

Windows PowerShell a plusieurs autres constructions de scripts, comprenant le commutateur, d'et ainsi de suite. Ces sont tous décrits dans les rubriques d'aide dans le shell « à propos de ». Parfois, vous pouvez utiliser les constructions couvertes ici pour remplacer ces autres constructions. Par exemple, vous pouvez remplacer le commutateur avec une instruction If construction utilise plusieurs sections ElseIf. Vous pouvez remplacer pour avec ForEach ou même avec la cmdlet ForEach-Object. Par exemple, ayant une boucle qui exécute exactement 10 fois :

1..10 | ForEach-Object -process {
  # code here will repeat 10 times
  # use $_ to access the current iteration
  # number
}

C'est à vous permet de sélectionner la meilleure construction pour faire le travail. Si vous êtes sur Internet pour les scripts, soyez prêt à s'exécuter sur toutes les variantes.

Fonctions

Une fonction est un type spécial de construction utilisé pour contenir un groupe de commandes associées qui effectuent une seule tâche spécifique. En règle générale, vous pouvez prendre n'importe quel script Windows PowerShell et « wrap » au sein d'une fonction :

function Mine {
  Get-Service
  Get-Process
}
Mine

Définit une nouvelle fonction appelée « Mine ». Qui transforme fondamentalement la mienne en une commande, ce qui signifie que vous pouvez exécuter la fonction simplement en entrant son nom. C'est ce que la ligne cinq fait. Il exécute la fonction.

Les fonctions sont généralement contenues dans un fichier de script. Un seul script peut contenir plusieurs fonctions. Les fonctions peuvent eux-mêmes contiennent encore des autres fonctions.

Toutefois, les fonctions sont des éléments ayant une étendue. Cela signifie que vous ne pouvez utiliser une fonction dans la même portée dans laquelle il a été créé. Si vous placez une fonction dans un script, puis exécutez ce script, la fonction sera uniquement disponible dans le script et seulement pendant la durée du script. Lorsque la fin du script en cours d'exécution, la fonction — comme tout le reste dans la portée du script — disparaît. Voici un exemple :

function One {
  function Two {
Dir
  }
  Two
}
One
Two

Supposons que vous saisissez la commande dans un fichier de script unique et exécutez ce script. Ligne sept exécute la fonction de celui qui commence sur la ligne. Ligne cinq exécute une fonction nommée Two, qui commence sur la ligne deux. Afin que le résultat sera une liste de répertoires qui se trouve sur la ligne 3 à l'intérieur de la fonction de deux.

Toutefois, la ligne suivante à exécuter sera ligne 8, et qui entraîne une erreur. Le script ne contient pas une fonction nommée Two. Fonction deux est enfoui dans la fonction. Par conséquent, qui existe dans la portée d'une fonction. Seulement d'autres choses au sein de la fonction peuvent voir deux. Essayez d'appeler deux à partir de n'importe où else entraîne une erreur.

Ajout de paramètres à un Script

Il est rare de créer un script a destinés à faire exactement la même chose chaque fois qu'elle s'exécute. Vous aurez plus fréquemment, les scripts contenant un type de données de la variable ou un comportement variable. Vous pouvez adapter ces variations avec les paramètres.

Les paramètres sont définis d'une manière spéciale en haut du script. Vous pouvez faire précéder cette définition de commentaires, mais il doit être dans le cas contraire les premières lignes exécutables de code dans le script. Dans la zone de définition de paramètre, chaque paramètre est séparé du suivant par une virgule. Conformément à l'idée de la mise en forme intéressante, il vous permet de placer chaque paramètre sur sa propre ligne. En voici un exemple :

param (
  [string]$computername,
  [string]$logfile,
  [int]$attemptcount = 5
)

Cet exemple définit trois paramètres. Dans le script, ils servent simplement comme toute autre variable. Vous remarquerez que sur la ligne de quatre, j'ai attribué une valeur par défaut pour le paramètre d'attemptcount $. La valeur par défaut peut être substituée par n'importe quel paramètre d'entrée, mais il sera utilisé si le script est exécuté sans ce paramètre est spécifié.

Voici plusieurs façons dans lequel le script peut être exécuté, en supposant que j'ai enregistré en tant que Test.ps1 :

./test -computername SERVER
./test -comp SERVER -log err.txt -attempt 2
./test SERVER err.txt 2
./test SERVER 2
./test -log err.txt -attempt 2 -comp SERVER

Le script accepte les paramètres grosso modo comme toute applet de commande. Les noms de variables sont utilisées comme noms de paramètre spécifiés avec le tiret habituel qui précède tous les noms de paramètre dans Windows PowerShell. Voici le détail de son fonctionnement :

  • Je suis uniquement l'un des paramètres spécifiant sur la ligne, —$ logfile sera donc vide et $attemptcount contiendra 5, sa valeur par défaut.
  • Sur la ligne deux, je spécifie tous les trois paramètres, bien que je fais de sorte à l'aide de raccourcie les noms de paramètre. Comme avec les applets de commande, il vous suffit de taper suffisamment le nom du paramètre Windows PowerShell à savoir celle qui vous parlez.
  • Ligne trois me montre à nouveau tous les trois paramètres, bien que je suis le faire positionnelle, sans l'aide de noms de paramètre. Tant que je me souviens de fournir des valeurs dans l'ordre exact dans lequel les paramètres sont répertoriés dans le script, cela fonctionnera correctement.
  • La ligne quatre affiche que se passe-t-il si vous ne faites pas attention. Ici, Nom_Ordinateur $ contiendra « Serveur » et $logfile contiendra 2, tandis que $attemptcount contiendra 5. C'est probablement pas I destiné. Lorsque vous n'utilisez pas les noms de paramètre, il est plus difficile d'être flexibles. Il est également plus difficile pour quelqu'un d'autre pour décoder ce que vous avez voulu, qui le rend plus difficile pour les résoudre les éventuels problèmes.
  • La ligne 5 est un exemple de mieux. Ici, j'ai spécifié les paramètres de désordre, mais c'est bien parce que j'ai utilisé des noms de paramètre. En règle générale, j'ai toujours utiliser des noms de paramètre pour le plus grand degré de flexibilité. Je n'avez pas besoin de mémoriser l'ordre dans lequel ils étaient.

Scripts avancés

Windows PowerShell prend en charge une technique permettant de spécifier des informations supplémentaires sur les paramètres. Cela vous permet de déclarer un paramètre comme obligatoires, accepte l'entrée à partir du pipeline et ainsi de suite. Cette technique est appelée liaison de l'applet de commande.

Il ne change pas la façon dont le script utilise les paramètres. Il donne simplement le shell un peu plus d'informations sur les paramètres. Vous trouverez cette technique plus couramment utilisée dans une fonction, mais la syntaxe est valide dans un script ainsi. Voici un exemple simple :

[CmdletBinding()]
param (
  [Parameter(Mandatory=$True)]
  [string]$computername,

  [Parameter(Mandatory=$True)]
  [string]$logfile,

  [int]$attemptcount = 5
)

Tout ce que j'ai ajouté était l'instruction [CmdletBinding()] comme la première ligne de code dans le script exécutable. Il est évident pour les commentaires précéder celui-ci, mais rien d'autre. J'ai également ajouté une instruction [Parameter()] à deux de mes paramètres. Dans cette instruction [Paramater()], je l'ai indiqué que ces paramètres sont obligatoires. Maintenant, si quelqu'un tente d'exécuter le script sans spécifier ces paramètres, Windows PowerShell vous demandera les informations.

Notez que le dernier paramètre ne dispose pas des instructions spéciales et tous les trois paramètres apparaissent toujours dans une liste séparée par des virgules (c'est-à-dire les deux premiers paramètres sont suivis par des virgules). Il existe une multitude d'autres instructions, vous pouvez spécifier un paramètre, vous pouvez en savoir plus sur dans la about_functions_advanced_parameters rubrique d'aide.

Il s'agissait d'un examen de certains concepts liés à la création de scripts de Windows PowerShell clés éclair. J'espère que vous avez appris une chose ou deux. Possibilité de générer les scripts paramétrés est particulièrement utile, car vous pouvez apporter des scripts qui ressemblent et se comportent comme des applets de commande native Windows PowerShell.

Don Jones

Don Jones est un destinataire de la récompense MVP de Microsoft et auteur au "en savoir plus Windows PowerShell dans un mois de déjeuner » (Manning Publications, 2011), un livre conçu pour aider à n'importe quel administrateur devenir efficace avec Windows PowerShell. Jones propose également une formation Windows PowerShell public et sur site. Contacter par l'intermédiaire de son site Web à l'adresse ConcentratedTech.com.

Contenu associé