Aide-mémoire Microsoft Powershell Ponctuation Il ne fait aucun doute que Microsoft Powershell fait un usage intensif des signes de ponctuation. La plupart d’entre eux ont une signification différente dans les pages du système d’aide que dans l’interpréteur de commandes lui-même. Signification des signes de ponctuation dans le shell Backtick ` — Le backtick est le caractère d’échappement de Microsoft Powershell. Il supprime la signification de tout caractère qui le suit. Par exemple, un espace est normalement un séparateur : c’est pourquoi cd c:\Program⎵Files génère une erreur. l’échappement de l’espace (→ cd c:\Program`⎵Files) supprime cette signification spéciale et force l’espace à être traité comme un caractère littéral, ce qui fait que la commande fonctionne. Tilde ~ — Lorsque le tilde est utilisé dans un chemin d’accès, il représente le répertoire personnel de l’utilisateur actuel, tel qu’il est défini dans la variable d’environnement UserProfile. Parenthèses ( ) — Les parenthèses sont utilisées de plusieurs manières : Comme en mathématiques, les parenthèses définissent l’ordre d’exécution. Microsoft Powershell exécute les commandes entre parenthèses en premier, des parenthèses les plus intérieures aux parenthèses les plus extérieures. C’est un bon moyen d’exécuter une commande et de faire en sorte que sa sortie alimente le paramètre d’une autre commande : Get-Service -computerName (Get-Content c:\computernames.txt) Les parenthèses entourent également les paramètres d’une méthode, et elles doivent être incluses même si la méthode ne requiert aucun paramètre : $mystring.replace('ship','spaceship') par exemple, ou Delete(). Crochets [ ] — Les crochets ont deux utilisations principales dans l’interpréteur de commandes : Ils contiennent le numéro d’index lorsque vous souhaitez faire référence à un seul objet dans un tableau ou une collection : $services[2] récupère le troisième objet de $services (les index partent toujours de zéro). Ils contiennent un type de données lorsque vous voulez convertir un élément de données en un type spécifique. Par exemple, $myresult / 3 -as [int] convertit le résultat en un nombre entier (integer), et [xml]$data = Get-Content data.xml lit le contenu du fichier Data.xml et tente de l’analyser comme un document XML valide. Accolades { } — Les accolades ont 3 utilisations : Elles contiennent des blocs de code exécutable ou des commandes, appelés blocs de script. Elles sont souvent ajoutées à des paramètres qui attendent un bloc de script ou un bloc de filtre : Get-Service | Where-Object { $_.Status -eq 'Running' }. Elles contiennent les paires clé=valeur qui constituent une nouvelle table de hachage. Dans ce cas, l’accolade ouvrante est toujours précédée du signe @. Dans l’exemple suivant, nous utilisons les accolades à la fois pour entourer 2 paires clé/valeur de la table de hachage et pour entourer un bloc de script, qui est la valeur de la deuxième clé : $hashtable = @{l='Label';e={expression}} Lorsque le nom d’une variable contient des espaces ou d’autres caractères normalement illégaux dans un nom de variable, les accolades doivent entourer le nom de la variable : ${Ma⎵Variable}. Guillemets simples ' ' — Les guillemets simples délimitent la suite des caractères qui constitue une chaîne alphanumérique. Microsoft Powershell ne cherchera ni à interpréter les caractères spéciaux (ex. : `, ?, …) ni à évaluer les variables (→ nom précédé de $) éventuellement présents à l’intérieur des guillemets simples. Guillemets double " " — Les guillemets doubles délimitent la suite de caractères d’une chaine alphnumérique tout comme les guillemets simples. Mais, au contraire de ces derniers, ils n’empêchent ni l’interprétation des caractères spéciaux ni l’évaluation des variables au sein de la chaîne. Par exemple, si la variable $one contient la valeur “World”, alors $two = "Hello $one `n" contiendra “Hello World” et un retour chariot (`n représente effectivement un retour chariot). Dollar $ — Le signe dollar indique à l’interpréteur de commandes que les caractères suivants, jusqu’à l’espace suivant, représentent un nom de variable. Cela peut s’avérer délicat lorsque l’on travaille avec des cmdlets qui gèrent des variables. Supposons que $one contienne la valeur “two”, New-Variable -name $one -value 'Hello' créera une nouvelle variable nommée nommée two, avec la valeur “Hello”, car le signe dollar indique à l’interpréteur de commandes que vous voulez utiliser le contenu de $one. En revanche, New-Variable -name one -value 'Hello' crée une nouvelle variable, $one. Pourcentage % — Le signe de pourcentage a 2 significations : soit il représente un alias de la cmdlet ForEach-Object. soit il repreprésente l’opérateur modulo, qui renvoie le reste d’une division entière. Point d’interrogatiop ? — Le point d’interrogation est un alias de la cmdlet Where-Object. Signe supérieur > — Le signe supérieur est une sorte d’alias de la cmdlet Out-File. Ce n’est techniquement pas un véritable alias, mais il permet de rediriger les fichiers à la manière de Cmd.exe : dir > files.txt. Tiret - — Le tiret, ou trait d’union, précède à la fois les noms de paramètres et de nombreux opérateurs, tels que -ComputerName ou -eq. Il sépare également le verbe et le nom d’une cmdlet, comme dans Get-Content, et sert enfin d’opérateur arithmétique de soustraction. Opérateur arithmétiques +, -, *, / et % — Ces opérateurs mathématiques fonctionnent comme des opérateurs arithmétiques standards. Noter que + est également utilisé pour la concaténation de chaînes de caractères. Arobase @ — Le signe arobase a 4 utilisations dans l’interpréteur de commandes : Il précède l’accolade ouvrante d’une table de hachage (voir [accolades] dans cette liste). Lorsqu’il est utilisé avant des parenthèses, il entoure une liste de valeurs séparées par des virgules qui forment un tableau : $array = @(1,2,3,4). Le signe @ et les parenthèses sont tous deux facultatifs, car le shell traitera normalement toute liste séparée par des virgules comme un tableau. Il désigne une chaîne de caractères en ligne, ou here-string, qui est un bloc de texte littéral qui peut se répartir sur plusieurs lignes . Une chaîne de caractères en ligne commence par @" ou @' suivi impérativement par un retour à la ligne et se termine par "@ ou '@ précédé impérativement par un retour à la ligne. $lyrics= @" I am the passenger and I ride and I ride I ride through the city's backsides I see the stars come out of the sky "@ Consulter l’aide about_quoting_rules pour plus d’informations et d’exemples. Il permet enfin de passer des collections de valeurs aux paramètres d’une commande (technique du “splatting”). Exemple d’appel d’une cmdlet sans “splatting” Copy-Item -Path "test.txt" -Destination "test2.txt" -WhatIf Même exemple mais avec utilisation du “splatting” pour passer les valeurs d’une table de hashage aux paramètres de la cmdlet $HashArguments = @{ (1) Path = "test.txt" Destination = "test2.txt" WhatIf = $true } Copy-Item @HashArguments (2) 1 ici, le @ qui précède les accolades indique qu’on définit une table de hashage et n’a donc rien à voir avec le “splatting” 2 là, '@' représente bien l’opérateur de “splatting” Esperluette & — L’esperluette est l’opérateur d’invocation de Microsoft Powershell, qui indique à l’interpréteur de commandes de traiter quelque chose comme une commande et de l’exécuter.Par exemple, $a = "Dir" place la chaîne “Dir” dans la variable $a. Ensuite, & $a exécutera la commande Dir. Point virgule ; — Le point-virgule est utilisé pour séparer deux commandes Microsoft Powershell indépendantes qui sont incluses sur une seule ligne. Dir ; Get-Process exécute Dir puis Get-Process. Les résultats de la séquence sont envoyés dans un pipeline, mais les résultats de Dir ne sont pas transmis à Get-Process. Dièse # — Le signe dièse est utilisé comme caractère de commentaire. Tous les caractères suivant #, jusqu’au retour chariot suivant, sont ignorés par l’interpréteur de commandes. Un commentaire multi-lignes est entouré par <# et #>. Égal = — Le signe égal est l’opérateur d’affectation, utilisé pour affecter une valeur à une variable : $one = 1. Il n’est pas utilisé pour les comparaisons d’égalité ; utiliser -eq à la place. Noter que le signe égal peut être utilisé conjointement avec un opérateur mathématique : $var +=5 ajoutera 5 à ce qui se trouve dans $var. Pipe | — Le pipe est utilisé pour transmettre la sortie d’une cmdlet à l’entrée d’une autre cmdlet. La deuxième cmdlet (celle qui reçoit la sortie) détermine quel(s) paramètre(s) recevra (recevront) les objets injectés dans le pipeline selon qu’ils sont passés par valeur ou par propriété. Slash /, backslash \ — Ces signes ont plusieurs significations selon le contexte : Le slash est utilisé comme opérateur de division dans les expressions mathématiques. Le slash ou le backslash peut indifféremment être utilisé comme séparateur dans les chemin d’accès aux fichiers/dossiers. Ex. : C:\Windows est identique à C:/Windows. Le backslash est également utilisé comme caractère d’échappement dans les expressions régulières (ex. : '^(\d{1,4})\s+=\s+(\w+)$')) et dans les critères de filtrage CIM (ex. : Get-CimInstance -Query "SELECT * FROM Win32_UserAccount WHERE Name = 'Tim O\'Brian'"). Point . — Le point a trois utilisations principales : Il est utilisé pour indiquer que vous voulez accéder à un membre, tel qu’une propriété ou une méthode d’un objet, ou à un objet imbriqué. Ex. : $_.Status accèdera à la propriété Status de l’objet qui se trouve dans la variable spéciale $_. Il est utilisé pour “dot-sourcer” un script, ce qui signifie que le script sera exécuté dans la portée courante, et que tout ce qui est défini par ce script restera défini une fois le script terminé. Ex. : . c:\myscript.ps1 . PS> '$hi="hello"' | out-file -FilePath myscript.ps1 (1) PS> .\myscript.ps1 (2) PS> $hi (3) PS> . .\myscript.ps1 (4) PS> $hi hello (5) 1 On crée un script qui se contente de définir une variable $hi 2 On exécute le script “normalement” 3 Après l’exécution “normale” du script, la variable $hi n’est pas connue ⇒ son contenu est vide 4 On exécute le script en le “dot sourçant” 5 Après l’exécution du script, la variable $hi est toujours connue et son contenu, défini dans le script, est affiché. Deux points sucessifs .. forment soit l’opérateur d’intervalle expliqué plus loin soit une référence au dossier parent dans un chemin d’accès aux fichiers/dossiers Virgule , — En dehors des guillemets, la virgule sépare les éléments d’une liste ou d’un tableau. Ex. : "Un",2, "Trois",4. Elle peut également être utilisée pour passer plusieurs valeurs à un paramètre qui peut les accepter. Ex. : Get-Process -computername Server1,Server2,Server3. Deux point : — Les deux points sont utilisés pour accéder aux membres statiques d’une classe. Ceci entre dans les concepts de programmation du .NET Framework/Core. Ex. : [-datetime]::now pour obtenir la date courante (noter qu’il est possible d’obtenir le même résultat en exécutant la cmdlet Get-Date). Point d’exclamation ! — Le point d’exclamation est un alias de l’opérateur booléen -not. Signification des signes de ponctuation dans les fichiers d’aide La ponctuation dans le fichier d’aide a une signification légèrement différente : Crochets [ ... ] — Les crochets qui entourent un texte indiquent que celui-ci est facultatif. Cela peut par exemple inclure la spécification entière d’un paramètre (ex. : *[-Nom <chaîne>]) ou indiquer qu’un paramètre est de type positionnel et que son nom est facultatif (ex. : [-Nom] <chaîne>). Il peut également indiquer qu’un paramètre est facultatif et, s’il est utilisé, qu’il peut être utilisé comme paramètre positionnel (ex. : [[-Nom] <chaîne>). Il est toujours légal d’utiliser le nom du paramètre en cas de doute. Crochets adjacents [ ] — Les crochets adjacents indiquent qu’un paramètre peut accepter plusieurs val- ues (ex. : <string[]> au lieu de <string>) Chevrons < > — Les chevrons entourent les types de données, indiquant le type de valeur ou d’objet qu’un paramètre attend. Ex. : <string>, <int>, <process> etc. Prenez toujours le temps de lire l’aide complète (ajoutez -full à la commande help). Elle fournit un maximum de détails ainsi que, dans la plupart des cas, des exemples d’utilisation. Quand utiliser $_ ? C’est probablement l’une des choses les plus déroutantes dans l’interpréteur de commandes : quand la variable spéciale $_ est-elle autorisée ? Cette variable spéciale n’est valide que lorsque l’interpréteur de commandes la recherche explicitement et qu’il est préparé à la remplir avec quelque chose. En général, cela ne se produit qu’à l’intérieur d’un bloc de script qui traite des entrées de pipeline, auquel cas la variable $_ contiendra un objet d’entrée à la fois. Vous rencontrerez cette situation à quelques endroits : Dans le bloc de script de filtrage utilisé par Where-Object : Get-Service | Where-Object {$_.Status -eq 'Running' } Dans les blocs de script transmis à ForEach-Object, tels que le bloc de script principal Process principal utilisé avec la cmdlet : Get-WmiObject -class Win32_Service -filter "name='mssqlserver'" | ForEach-Object -process { $_.ChangeStartMode('Automatic') } Dans le bloc de script Process d’une fonction de filtrage ou d’une fonction avancée. Dans l’expression d’une table de hachage utilisée pour créer une propriété personnalisée ou une colonne de table. Reportez-vous à la section 28.4 de ce chapitre pour plus de détails Dans tous ces cas, $_ n’apparaît qu’à l’intérieur des accolades d’un bloc de script. C’est une bonne règle à retenir pour déterminer quand il est acceptable d’utiliser $_. 🞄 🞄 🞄 Introduction à Microsoft Powershell Liens Microsoft Powershell