{"id":67,"date":"2020-11-01T18:44:56","date_gmt":"2020-11-01T17:44:56","guid":{"rendered":"http:\/\/theredwindows.net\/?p=67"},"modified":"2021-07-30T19:10:49","modified_gmt":"2021-07-30T17:10:49","slug":"powershell-variables-types-et-operateurs-logiques","status":"publish","type":"post","link":"https:\/\/theredwindows.net\/index.php\/2020\/11\/01\/powershell-variables-types-et-operateurs-logiques\/","title":{"rendered":"PowerShell &#8211; Variables, types et op\u00e9rateurs logiques"},"content":{"rendered":"\n<p>Comme dans tout langage de programmation, PowerShell permet de stocker des donn\u00e9es (ou des objets, qui poss\u00e8dent des types particuliers) dans des variables, et d&#8217;effectuer des op\u00e9rations logiques avec ces derni\u00e8res.<\/p>\n\n\n\n<h3>Variables<\/h3>\n\n\n\n<p>En PowerShell une variable est instanci\u00e9e de plusieurs mani\u00e8res diff\u00e9rentes, comme ce qui suit.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">New-Variable -Name \"NOM\" -Value \"VALEUR\"\n # si la variable existe d\u00e9j\u00e0 une erreur est lev\u00e9e\nSet-Variable -Name \"NOM\" -Value \"VALEUR\"\n$NOM = \"VALEUR\"<\/pre>\n\n\n\n<p>Dans le cas 3, le symbole &#8220;\u00e9gal&#8221; peut \u00eatre substitu\u00e9 pour faire une op\u00e9ration d\u2019attribution:<\/p>\n\n\n\n<ul><li><code>+=<\/code>, ajoute la valeur de droite \u00e0 la variable.<\/li><li><code>-=<\/code>, enl\u00e8ve la valeur de droite \u00e0 la variable.<\/li><li><code>*=<\/code>, multiplie la variable par la valeur \u00e0 droite et sauvegarde le r\u00e9sultat.<\/li><li><code>\/=<\/code>, divise la variable par la valeur \u00e0 droite et sauvegarde le r\u00e9sultat.<\/li><li><code>%=<\/code>, sauvegarde le r\u00e9sultat de la division euclidienne de la variable par la valeur de droite.<\/li><\/ul>\n\n\n\n<p>Le nom d\u2019une variable n\u2019a pas de restrictions de nom, simplement s\u2019il est choisi un nom d\u00e9j\u00e0 utilis\u00e9, cela changera sa valeur. Globalement en PowerShell les mots de sont pas sensibles \u00e0 la casse (sauf les cha\u00eenes de caract\u00e8res en cas de comparaison \u00e9videmment), donc <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$AbCd<\/code><\/code> est \u00e9gal \u00e0 <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$abcd<\/code><\/code>. Dans le cas o\u00f9 la variable est d\u00e9fini avec les m\u00e9thodes une et deux, le nom n&#8217;est pas n\u00e9cessairement imprimable. Si une variable n\u2019a jamais \u00e9t\u00e9 d\u00e9finie mais utilis\u00e9e, aucune erreur ne sera lev\u00e9e, sa valeur sera <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$null<\/code><\/code>. Pour obtenir la valeur contenue dans une variable, il faut simplement entrer son nom dans PowerShell, en pr\u00e9cisant bien s\u00fbr le <code>$<\/code>. Il peut aussi \u00eatre utilis\u00e9 les cmdlets <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Write-Host<\/code><\/code> ainsi que <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Write-Output<\/code><\/code> en pr\u00e9cisant le nom de la variable. Les variables cr\u00e9\u00e9es \u00e0 l&#8217;ext\u00e9rieur d\u2019une fonction ou d\u2019une classe sont par d\u00e9faut global. Pour supprimer une Variable il faut utiliser la cmdlet <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Remove-Variable<\/code><\/code> avec comme argument<code> -Name NOM_DE_LA_VARIABLE<\/code>. Par d\u00e9faut les variables acceptent tous les types, si un type particulier est exig\u00e9, il faut le sp\u00e9cifier avant le nom de la variable entre crochet.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"402\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/var-1024x402.png\" alt=\"\" class=\"wp-image-75\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/var-1024x402.png 1024w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/var-300x118.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/var-768x301.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/var-400x157.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/var-800x314.png 800w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/var.png 1073w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3>Types<\/h3>\n\n\n\n<p>Les diff\u00e9rents types de bases sont les m\u00eames que ceux disponible en .NET, c\u2019est \u00e0 dire pour les plus communs &#8220;string&#8221; (des cha\u00eenes de caract\u00e8res), <code>int<\/code> (<code>int16<\/code>,<code>int32<\/code>,<code>int64<\/code>, des nombres entier et n\u00e9gatifs\/positifs), \u201cdouble\u201d (des nombres n\u00e9gatifs\/positifs, d\u00e9cimaux),<code>boolean<\/code> (valeur soit vrai, soit fausse), <code>Array<\/code> (tableau, similaire au liste en python), et <code>hashtable<\/code> (similaire au dictionnaire dans le langage au serpent), et enfin les <code>PSCustomObject\/PSObject<\/code> (objet aux propri\u00e9t\u00e9s que nous d\u00e9finissons).<\/p>\n\n\n\n<p>Les <code>String<\/code> issus de l\u2019espace de nom <code>System<\/code>, sont des cha\u00eenes de caract\u00e8res, de longueur multiple. Elle est d\u00e9finie entre apostrophes ou guillemets, il existe une diff\u00e9rence entre les deux, qui est exactement la m\u00eame qu\u2019en C#: une variable peut \u00eatre appel\u00e9e dedans pour faire une concat\u00e9nation. Une cha\u00eene de caract\u00e8res peut s\u2019\u00e9tendre sur plusieurs lignes pour cela, en plus des apostrophes ou guillemets, il faut ajouter un arobase. Il est \u00e0 noter que la diff\u00e9rence entre les deux mani\u00e8res de d\u00e9finition est toujours valable ici. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"631\" height=\"644\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/string1-1.png\" alt=\"\" class=\"wp-image-70\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/string1-1.png 631w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/string1-1-294x300.png 294w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/string1-1-400x408.png 400w\" sizes=\"(max-width: 631px) 100vw, 631px\" \/><\/figure>\n\n\n\n<p>Il existe diff\u00e9rentes m\u00e9thodes autour de ce type, en voici quelques-unes:<\/p>\n\n\n\n<ul><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$string.ToUpper()<\/code><\/code> permet de mettre tous les caract\u00e8res en majuscules.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$string.ToLower()<\/code><\/code> permet de mettre tous les caract\u00e8res en minuscules.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$string.Split('CHAR')<\/code><\/code> permet de s\u00e9parer la cha\u00eenes de caract\u00e8res en tableau s\u00e9par\u00e9 tous les <code>CHAR<\/code>.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$string.SubString(START, END)<\/code><\/code>, permet de r\u00e9cup\u00e9rer un morceau de la cha\u00eene, \u00e0 partir deux index.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$string.IndexOf('STRING')<\/code><\/code> permet d\u2019obtenir un entier correspondant \u00e0 l\u2019index de <code>STRING<\/code> dans la cha\u00eene.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$string.Replace('STRING1', 'STRING2')<\/code><\/code>, permet de replacer tous les <code>STRING1<\/code> pr\u00e9sent dans la cha\u00eene par <code>STRING2<\/code>.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$string.Length<\/code><\/code> permet d\u2019obtenir la longueur de la cha\u00eene de caract\u00e8res.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$string.Contains('STRING')<\/code><\/code> permet d\u2019obtenir un <code>boolean <\/code>repr\u00e9sentant la pr\u00e9sence de <code>STRING<\/code> dans la cha\u00eene.<\/li><\/ul>\n\n\n\n<p>La plupart de ces m\u00e9thodes sont encore une fois issue de C#. Pour avoir la liste compl\u00e8te de toutes les m\u00e9thodes, il faudra effectuer <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Member -inputObject $string<\/code><\/code> (cette op\u00e9ration est valide pour tous les types).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"678\" height=\"560\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/string2.png\" alt=\"\" class=\"wp-image-69\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/string2.png 678w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/string2-300x248.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/string2-400x330.png 400w\" sizes=\"(max-width: 678px) 100vw, 678px\" \/><\/figure>\n\n\n\n<p>Les &#8220;Int&#8221; sont issus de l\u2019espace de nom <code>System<\/code>, les <code>int<\/code> sont des nombres plus ou moins grands. Ils sont d\u00e9finis par le simple fait de les \u00e9crire, par d\u00e9faut, ce sera un <code>Int32<\/code>. Il est possible de faire diff\u00e9rentes op\u00e9rations entre des nombres en utilisant des op\u00e9rateurs, <code>+<\/code> sert \u00e0 additionner, <code>-<\/code> sert \u00e0 soustraire, <code>\/<\/code> \u00e0 diviser, <code>*<\/code> \u00e0 multiplier, <code>%<\/code> est le modulo ou le r\u00e9sultat d\u2019une division euclidienne. Pour d\u2019autres calculs plus complexes tels l&#8217;exponentiation, les racines et autres calculs trigonom\u00e9triques, il faudra interagir avec <code>System.Math<\/code>. Il existe tr\u00e8s peu de m\u00e9thodes sur les entiers, mais en voici deux:<\/p>\n\n\n\n<ul><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$int.ToString()<\/code><\/code> permet de convertir l\u2019entier en cha\u00eene de caract\u00e8res.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$int.Equals(Int)<\/code><\/code> permet d\u2019obtenir un <code>boolean<\/code> repr\u00e9sentant la comparaison \u00e9galitaire entre <code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$int<\/code> et <code>Int<\/code>.<\/li><\/ul>\n\n\n\n<p>Le reste \u00e9tant surtout des m\u00e9thodes li\u00e9es \u00e0 la conversion des objets.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"593\" height=\"498\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Int.png\" alt=\"\" class=\"wp-image-71\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Int.png 593w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Int-300x252.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Int-400x336.png 400w\" sizes=\"(max-width: 593px) 100vw, 593px\" \/><\/figure>\n\n\n\n<p>Les <code>doubles<\/code> sont issus de l\u2019espace de nom <code>System<\/code>, toutes leurs caract\u00e9ristiques sont identiques aux <code>int<\/code>.<\/p>\n\n\n\n<p>Les <code>boolean<\/code> sont issus de l\u2019espace de nom <code>System<\/code>. La particularit\u00e9 de PowerShell sur ces derniers c\u2019est qu\u2019ils ne repr\u00e9sentent pas une valeur particuli\u00e8re mais une variable: il existe <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$true<\/code><\/code> et <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$false<\/code><\/code>. Les m\u00e9thodes disponibles pour les <code>boolean<\/code> sont les m\u00eames que celles pour les entier pour les <code>double<\/code>.<\/p>\n\n\n\n<p>Les <code>Array<\/code> sont issus de l\u2019espace de nom <code>System<\/code> (oui encore). Les tableaux sont des collections de valeurs, de longueur initiale <strong>d\u00e9finie<\/strong>. On d\u00e9finit un tableau avec un arobase suivi de parenth\u00e8ses dans lesquelles on place les valeurs souhait\u00e9es (elles peuvent \u00eatre des variables) s\u00e9par\u00e9es par des virgules. Le tableau accepte par d\u00e9faut tous les types possibles (<code>System.Object[]<\/code>, les crochets signifient qu\u2019il s&#8217;agit d\u2019un tableau), si un type pr\u00e9cis est exig\u00e9 il faut ajouter entre crochet, avant le nom de la variable lors de sa d\u00e9finition, le type souhait\u00e9 sans oublier les crochets. Pour ajouter une entr\u00e9e au tableau, comme la taille du tableau est d\u00e9finie, il est impossible d\u2019utiliser la m\u00e9thode <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">.Add()<\/code><\/code>. Il faut donc utiliser l\u2019op\u00e9rateur <code>+=<\/code> , ce qui aura pour effet de cr\u00e9er un tableau qui sera l\u2019addition du pr\u00e9c\u00e9dent et d\u2019un de longueur 1 contenant la valeur \u00e0 ajouter. Pour trier les \u00e9l\u00e9ments d\u2019un tableau il faut utiliser la cmdlet <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Sort-Object<\/code><\/code> qui les triera par d\u00e9faut dans l\u2019ordre suivant: bool\u00e9en, nombre par ordre croissant, cha\u00eene de caract\u00e8re par ordre alphab\u00e9tique. Pour acc\u00e9der aux objets d\u2019un tableau il faut utiliser l\u2019indexation qui est effectu\u00e9e comme en python: en ouvrant des crochets apr\u00e8s l\u2019appel de la variable ou du tableau, puis de son index. On peut aussi y acc\u00e9der avec la cmdlet <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">ForEach-Object<\/code><\/code>, les valeurs pass\u00e9es dans la &#8220;pipeline&#8221; seront individuellement stock\u00e9es chacune leur tour dans une variable qui est nomm\u00e9e <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$_<\/code><\/code>. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"952\" height=\"486\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/tab1-1.png\" alt=\"\" class=\"wp-image-73\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/tab1-1.png 952w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/tab1-1-300x153.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/tab1-1-768x392.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/tab1-1-400x204.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/tab1-1-800x408.png 800w\" sizes=\"(max-width: 952px) 100vw, 952px\" \/><\/figure>\n\n\n\n<p>Pour pallier \u00e0 certains probl\u00e8mes li\u00e9s au tableau, il existe plusieurs alternatifs dont les <code>ArrayList<\/code> ainsi que les <code>List<\/code>. Ces derni\u00e8res sont issues de l\u2019espace de nom <code>System.Collections<\/code>. Microsoft l\u2019a d\u00e9fini comme \u00e9tant un tableau cr\u00e9\u00e9e de mani\u00e8re dynamique, ce qui permet de pouvoir ajouter des \u00e9l\u00e9ments apr\u00e8s la d\u00e9finition d\u2019une liste. Toutes les op\u00e9rations vues sur les tableaux restent valides mais de nouvelles m\u00e9thodes sont d\u00e9sormais disponibles. La cr\u00e9ation d\u2019une liste est effectu\u00e9e avec la cmdlet <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">New-Object<\/code><\/code> qui permet de cr\u00e9er un objet .NET dans PowerShell la syntaxe sera la suivante: <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$list = New-Object System.Collections.Generic.List[]<\/code><\/code> entre crochet sera le type de chaque \u00e9l\u00e9ment de la liste (si il est souhait\u00e9 n\u2019importe quel type il faudra sp\u00e9cifier <code>System.Object<\/code>). Les <code>ArrayList<\/code> sont issu du m\u00eame espace de nom et poss\u00e8dent des caract\u00e9ristiques similaires. On les d\u00e9finit avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">New-Object<\/code><\/code> et leur chemin <code>System.Collections.ArrayList<\/code>. Quand on ajoute une valeur \u00e0 un <code>ArrayList<\/code>, son index est retourn\u00e9, pour \u00e9viter ce comportement, il faut rediriger le r\u00e9sultat vers <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$null<\/code><\/code> avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$null = $ArrayList.Add(1)<\/code><\/code> ou <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$ArrayList.Add(1) | Out-Null<\/code><\/code>, la premi\u00e8re m\u00e9thode est sensiblement plus rapide (cette astuce est aussi valide pour ne pas afficher le r\u00e9sultat de n\u2019importe quelle Cmdlet).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"723\" height=\"387\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/arraylist.png\" alt=\"\" class=\"wp-image-78\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/arraylist.png 723w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/arraylist-300x161.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/arraylist-400x214.png 400w\" sizes=\"(max-width: 723px) 100vw, 723px\" \/><\/figure>\n\n\n\n<p>Les <code>hashtable<\/code> sont issus de l\u2019espace de nom <code>System.Collections<\/code>. Les <code>hashtable<\/code> sont une liste d\u2019objets, qui sont d\u00e9finis chacun par une clef et une valeur associ\u00e9e. On d\u00e9finit une <code>hashtable<\/code> par un arobase suivi d\u2019entre accolades les objets; une clef est s\u00e9par\u00e9e de sa valeur par un \u00e9gal, chaque objet doit \u00eatre s\u00e9par\u00e9 d\u2019un autre par un point-virgule. Une clef et sa valeur peuvent tous deux adopter n\u2019importe quelle type valeur. Les valeurs seront affich\u00e9es dans un ordre plus ou moins al\u00e9atoires, pour les garder dans celui de d\u00e9finition, il faut ajouter l\u2019acc\u00e9l\u00e9rateur de type <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">[ordered]<\/code><\/code> (le chemin complet serait <code>System.Collections.Specialized.OrderedDictionary<\/code>) juste avant l\u2019arobase. Il existe plusieurs m\u00e9thodes autour des <code>hashtable<\/code> en voici quelques-unes:<\/p>\n\n\n\n<ul><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$hash.Add('Key1', 'Value1')<\/code><\/code>, permet d\u2019ajouter une nouvelle entr\u00e9e \u00e0 la <code>hashtable<\/code> <code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$hash<\/code> la clef <code>Key1<\/code> et sa valeur <code>Value1<\/code> (il existe d\u2019autres m\u00e9thode qui sont identique \u00e0 celle des tableaux).<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$hash.Remove('Key1')<\/code><\/code>, permet de supprimer l&#8217;entr\u00e9e <code>Key1<\/code> de la <code>hashtable<\/code> <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$hash<\/code><\/code>.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$hash.keys<\/code><\/code>, permet de retourner un tableau contenant les clefs de la <code>hashtable<\/code> <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$hash<\/code><\/code>.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$hash.values<\/code><\/code>, permet de retourner un tableau contenant les valeurs de la <code>hashtable<\/code> <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$hash<\/code><\/code>.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"560\" height=\"836\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/hash.png\" alt=\"\" class=\"wp-image-76\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/hash.png 560w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/hash-201x300.png 201w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/hash-400x597.png 400w\" sizes=\"(max-width: 560px) 100vw, 560px\" \/><\/figure>\n\n\n\n<p>Les <code>hashtable<\/code> peuvent aussi \u00eatre utilis\u00e9s comme argument de cmdlet. C\u2019est une fonctionnalit\u00e9 originale mais tr\u00e8s pratique pour simplifier le code et\/ou le rendre plus lisible\/beau; pour cela il faut la sauvegarder dans une variable et appeler la fonction comme ceci <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Invoke-MyCmdlet @hash<\/code><\/code>. Enfin les <code>hashtable<\/code> peuvent aussi \u00eatre utilis\u00e9s pour caract\u00e9riser un objet .NET comme par exemple les <code>PSCustomObject<\/code>. Il existe une alternative au <code>hashtable<\/code>, mais sont dans l\u2019essence la m\u00eame chose. Les <code>dictionnary<\/code> sont issus de l\u2019espace de nom <code>System.Collection.Generic<\/code>, on l\u2019a d\u00e9fini comme ceci <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$dict = New-Object 'System.Collections.Generic.Dictionary``2[]'<\/code><\/code>, entre crochet il est n\u00e9cessaire de passer 2 types correspondants aux cl\u00e9s (en 1) et aux valeurs (en 2). Les dictionnaires sont en de tr\u00e8s nombreux points similaires aux <code>hashtable<\/code>, on peut, elles aussi, les passer en argument \u00e0 une cmdlet, de la m\u00eame mani\u00e8re.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"908\" height=\"238\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/dict.png\" alt=\"\" class=\"wp-image-77\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/dict.png 908w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/dict-300x79.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/dict-768x201.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/dict-400x105.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/dict-800x210.png 800w\" sizes=\"(max-width: 908px) 100vw, 908px\" \/><\/figure>\n\n\n\n<p>Les <code>PSCustomObject<\/code> sont issus de l\u2019espace de nom <code>System.Management.Automation<\/code>. Les <code>PSCustomObject<\/code> sont des objets sp\u00e9cifiques \u00e0 PowerShell. Ils permettent de cr\u00e9er une forme de <code>hashtable<\/code> dans laquelle, les noms de propri\u00e9t\u00e9s sont choisis (au lieu de cl\u00e9 et valeur par exemple). En r\u00e9alit\u00e9 ils servent de base aux <code>PSObject<\/code>. On d\u00e9finit un <code>PSCustomObject<\/code> de deux mani\u00e8res diff\u00e9rentes. En utilisant <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">New-Object<\/code><\/code> suivi des arguments <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">-TypeName psobject<\/code><\/code> et <code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">-Property $hash<\/code> (ou bien en utilisant directement le type litt\u00e9ral <code>System.Management.Automation.PSObject<\/code>). En utilisant un acc\u00e9l\u00e9rateur de type <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">[PSCustomObject]<\/code><\/code> suivi d\u2019une <code>hashtable<\/code>; dans les deux cas, les cl\u00e9s des <code>hashtable<\/code> serviront de nom de propri\u00e9t\u00e9, et leur valeur, la valeur associ\u00e9e. Pour ajouter un membre \u00e0 un <code>PSObject<\/code> il faut utiliser la cmdlet <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Add-Member<\/code><\/code> comme ceci: <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Add-Member -InputObject $psobject 'property1' 'value1'<\/code><\/code>. Pour supprimer un membre d\u2019un <code>PSObject<\/code> il faut acc\u00e9der \u00e0 ses propri\u00e9t\u00e9s intrins\u00e8ques et le supprimer: <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$psobject.PSObject.Properties.Remove('property1')<\/code><\/code>. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"881\" height=\"556\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/psobject.png\" alt=\"\" class=\"wp-image-74\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/psobject.png 881w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/psobject-300x189.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/psobject-768x485.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/psobject-400x252.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/psobject-800x505.png 800w\" sizes=\"(max-width: 881px) 100vw, 881px\" \/><\/figure>\n\n\n\n<p>Les objets de ce type sont hautement personnalisables. Il est possible notamment de changer le <code>PSTypeName<\/code> d\u2019un <code>PSCustomObject<\/code>. Ils permettent de repr\u00e9senter un type qu\u2019il soit r\u00e9el ou non, cependant ils n&#8217;apparaissent pas en utilisant la m\u00e9thode <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">.GetType()<\/code><\/code> mais on y acc\u00e8de avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">$psobject.PSTypeNames<\/code><\/code> ou <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Member -InputObject $psobject<\/code><\/code>. Il existe trois mani\u00e8res de faire:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># m\u00e9thode 1\n$psobject.PSObject.TypeNames.Insert(0, 'MyType')\n# m\u00e9thode 2\n$psobject.PSTypeNames.Clear()\n$psobject.PSTypeNames.Add('MyType')\n# m\u00e9thode 3\n$psobject = New-Object System.Management.Automation.PSObject -Property @{PSTypeName = 'MyType'; name = \"toto\"}<\/pre>\n\n\n\n<p>Les conversions entre type peuvent se faire de diff\u00e9rentes mani\u00e8res:<\/p>\n\n\n\n<ul><li>en pr\u00e9cisant entre crochet le type suivit d\u2019une variable.<\/li><li>en utilisant l\u2019op\u00e9rateur <code>-as<\/code> suivi du type entre crochet.<\/li><\/ul>\n\n\n\n<p>Attention cependant, parfois il n\u2019est pas possible de convertir deux objets !<\/p>\n\n\n\n<p>Ici ont \u00e9t\u00e9 pr\u00e9sent\u00e9s les types principaux en PowerShell, il ne faut cependant pas oublier que PowerShell prend en charge TOUS les types .NET ainsi que leurs diff\u00e9rentes m\u00e9thodes. Pour beaucoup, il vous sera plus ais\u00e9 de trouver les informations dans la documentation Microsoft sur C#.<\/p>\n\n\n\n<h3>Op\u00e9rateurs<\/h3>\n\n\n\n<p>Commen\u00e7ons par les op\u00e9rateurs arithm\u00e9tiques. Il faut savoir que c\u2019est le TYPE de l\u2019objet \u00e0 gauche de l\u2019op\u00e9rateur qui d\u00e9finira le type du r\u00e9sultat, ce qui veut dire que l\u2019on peut additionner un entier avec une chaine de caract\u00e8re. Il existe <code>+<\/code> qui exprime une addition, <code>-<\/code> la soustraction, <code>%<\/code> modulo qui est le reste d\u2019une division euclidienne, <code>\/<\/code> qui permet de diviser, et <code>*<\/code> qui multiplie. Pour d\u2019autres op\u00e9rations math\u00e9matiques, il est obligatoire de passer par l\u2019espace de nom <code>System.Math<\/code>. Les op\u00e9rateurs logiques permettent d\u2019ajouter des conditions, ou de la changer. Voici une liste des op\u00e9rateurs disponibles ainsi que leur utilisation:<\/p>\n\n\n\n<ul><li><code>-and<\/code>, renvoie <code>$true<\/code> si l\u2019expression de gauche et l\u2019expression de droite sont vraies.<\/li><li><code>-or<\/code>, renvoie <code>$true<\/code> si l\u2019expression de gauche ou l\u2019expression de droite est vraie.<\/li><li><code>-not<\/code>, renvoie l\u2019inverse du bool\u00e9en renvoy\u00e9 par l\u2019expression de droite, son alias est <code>!<\/code>.<\/li><li><code>-xor<\/code>, se comporte comme <code>-or<\/code>, seulement si les deux expressions sont vraies, alors il sera retourn\u00e9 <code>$false<\/code>, si les deux expressions sont faussent, il sera retourn\u00e9 <code>$false<\/code>.<\/li><\/ul>\n\n\n\n<p>Les op\u00e9rateurs de comparaison renvoie un bool\u00e9en si une condition est remplie:<\/p>\n\n\n\n<ul><li><code>-eq<\/code>, renvoie <code>$true<\/code> si l\u2019expression de gauche est \u00e9gale \u00e0 l\u2019expression de droite.<\/li><li><code>-ne<\/code>, renvoie <code>$true<\/code> si l\u2019expression de gauche n\u2019est pas \u00e9gale \u00e0 l\u2019expression de droite.<\/li><li><code>-lt<\/code>, renvoie <code>$true <\/code>si l\u2019expression de gauche est inf\u00e9rieure \u00e0 l\u2019expression de droite.<\/li><li><code>-le<\/code>, renvoie <code>$true<\/code> si l\u2019expression de gauche est inf\u00e9rieure ou \u00e9gale \u00e0 l\u2019expression de droite.<\/li><li><code>-gt<\/code>, renvoie <code>$true<\/code> si l\u2019expression de gauche est plus grande que l\u2019expression de droite.<\/li><li><code>-ge<\/code>, renvoie <code>$true<\/code> si l\u2019expression de gauche est plus grande ou \u00e9gale \u00e0 l\u2019expression de droite.<\/li><li><code>-match<\/code>, renvoie <code>$true<\/code> si la cha\u00eene de caract\u00e8re de gauche remplit les conditions regex de droite.<\/li><li><code>-notmatch<\/code>, renvoie <code>$true<\/code> si la cha\u00eene de caract\u00e8re de gauche ne remplit pas les conditions regex de droite.<\/li><li><code>-like<\/code>, renvoie <code>$true<\/code> si la cha\u00eene de caract\u00e8re de gauche remplit une wildcard \u00e0 droite de l\u2019op\u00e9rateur.<\/li><li><code>-notlike<\/code>, renvoie <code>$true<\/code> si la cha\u00eene de caract\u00e8re de gauche ne remplit pas une wildcard \u00e0 droite de l\u2019op\u00e9rateur.<\/li><li><code>-contains<\/code>, renvoie <code>$true<\/code> si la cha\u00eene de caract\u00e8re de gauche contient la cha\u00eene de caract\u00e8re de droite.<\/li><li><code>-notcontains<\/code>, renvoie <code>$true<\/code> si la cha\u00eene de caract\u00e8re de gauche ne contient pas la cha\u00eene de caract\u00e8re de droite.<\/li><\/ul>\n\n\n\n<p>Les op\u00e9rateurs de type permettent d\u2019effectuer des op\u00e9rations logiques sur les types des objets compar\u00e9s:<\/p>\n\n\n\n<ul><li><code>-is<\/code>, renvoie<code> $true<\/code> si le type de gauche est le m\u00eame que le type de droite.<\/li><li><code>-isnot <\/code>renvoie <code>$true<\/code> si le type de gauche n\u2019est pas le m\u00eame que le type de droite.<\/li><\/ul>\n\n\n\n<p>Il existe encore d\u2019autres op\u00e9rateurs comme par exemple:<\/p>\n\n\n\n<ul><li><code>-join<\/code> suivit d&#8217;un tableau, permet de faire une concat\u00e9nation.<\/li><li><code>-split<\/code>, poss\u00e8de un comportement analogue \u00e0 la m\u00e9thode sur <code>string<\/code> <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">.Split()<\/code><\/code>.<\/li><\/ul>\n\n\n\n<p>Le prochain article traitera des boucles, des structures conditionnelles, et de la gestion des exceptions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comme dans tout langage de programmation, PowerShell permet de stocker des donn\u00e9es (ou des objets, qui poss\u00e8dent des types particuliers) dans des variables, et d&#8217;effectuer des op\u00e9rations logiques avec ces derni\u00e8res. Variables En PowerShell une variable est instanci\u00e9e de plusieurs mani\u00e8res diff\u00e9rentes, comme ce qui suit. Dans le cas 3, le symbole &#8220;\u00e9gal&#8221; peut \u00eatre [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/67"}],"collection":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/comments?post=67"}],"version-history":[{"count":5,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/67\/revisions"}],"predecessor-version":[{"id":263,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/67\/revisions\/263"}],"wp:attachment":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/media?parent=67"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/categories?post=67"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/tags?post=67"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}