<figureclass="image image_resized"style="width:35.82%;"><imgsrc="https://www.seekpng.com/png/full/831-8318055_february-5-windows-powershell-logo.png"alt="February 5 @ - Windows Powershell Logo | Full Size PNG Download | SeekPNG"></figure>
<h1>Les commandes ou applets de commande (cmdlet)</h1>
<p>Elles sont composées d’une paire de la forme “verbe ”-“nom” destiné à en faciliter la mémorisation.</p>
<p>petite astuce, vous pouvez lister tout les verbes que PowerShell utilise avec la commande <code>Get-verb</code>. faites un essai…</p>
<p>simple non?</p>
<h1>Le pipeline</h1>
<p>Le pipeline, symbolisée par le caractère “<strong>|</strong>” (<strong>AltGr</strong> + <strong>6</strong>) permet d'exécuter plusieurs commandes à la suite.</p>
<p>Cette commande <code>Get-Help</code> permet d'avoir une aide de manière très générale si on souhaite obtenir plus d'informations on peut ajouter l'option <code>-detailed</code></p>
<p>On peut constater dans la capture que certains paramètres doivent obligatoirement comportés des valeurs. Vous pouvez également voir tout en bas les liens connexes à cette commande.</p>
<p>La commande <code>Get-Help</code> permet également de rechercher une commande si, par exemple, vous souhaitez trouver une commande qui gère les services.</p>
<p>Dans PowerShell, les alias permettent de créer des abréviations de commande. Je m'explique, vous connaissez certainement un alias que vous exécuter dans votre invite de commande. NON?</p>
<p>et <code>cd</code> c'est un alias de <code>change-directory</code>.</p>
<p>Et bien avec PowerShell vous avez la possibilité de les lister, les supprimer les modifier et même de les créer…</p>
<p>A titre personnel, j'utilise très peu les alias, mais il faut en connaitre certains lorsque vous essayez de lire un script réalisé par une autre personne.</p>
<p>Maintenant que nous avons vu, comment était composée une commande, le pipeline et l'aide, il est temps, comme je vous l'ai dis dans le premier chapitre, que tout était objet dans PowerShell et de découvrir plus en détail ce que sont les propriétés les méthodes. C'est à cet instant, que nous alors voir quelle commande va nous permettre de lister tout cela.</p>
<p><code>Get-Member</code> est la commande qui nous dis quels sont les propriétés et les méthodes que nous pouvons appliquer à un objet.</p>
<p>(Vous remarquerez que j'utilise la commande <code>Get-Service</code>, que je récupère toutes les méthodes et propriétés en passant par une seconde commande <code>Get-Member</code> et pour enchainer ces commandes j'opte pour un pipeline)</p>
<p>C'est à partir de ces éléments qu'à présent on peut savoir quelles sont les propriétés et les méthodes d'un service. </p>
<p>Exemple, si vous voulez parcourir la base de registre machine il suffit de taper <code>cd hklm:</code> et vous vous retrouvez dans la base de registre et la parcourir comme si c'était un filesystem et revenir dans votre arborescence Windows avec un <code>cd c:</code>.</p>
<p>Vous avez ensuite la possibilité de créer ou de consulter des entrées dans la base de registre comme si c'était un filesystem et utiliser les commandes de base.</p>
<p>Pour modifier la valeur d'une clé de registre ou des propriétés d'un élément je vous laisse consulter la commande</p>
<p>Wmi (Windows Management instrumentation),implémenté dans Windows, permet d'obtenir des informations sur un système et même à distance tel que la version du bios, le nom de la machine, le fabricant, le modèle, la date d'installation etc. Cela permet en quelques sortes d'interroger l'inventaire matériel et logiciel de votre système. </p>
<p><code><u>Get-CimInstance</u></code> est une commande, qui se base sur des instances CIM (Common Information Model ) , WS-MAN (WS-Management) et le protocole WInRM (<i>Windows Remote Management), couplé au protocole SOAP (Simple Object Acces Protocol).</i></p>
<p>Vous remarquez que j'utilise l'option <code>-classname</code> ? et oui, en effet, toutes les requêtes WMI et les instances CIM sont regroupées par classe. Et c'est maintenant, que je vous montre comment je fais pour m'y retrouver dans toutes ces classes.</p>
<p>C'est alors que nous vient en aide la commande <code>Get-Cimclass</code>.</p>
<p>Si on exécute cette commande on voit que la liste est longue et que cela peut paraitre un peu compliqué, à première vue, et par forcément facile à lire. De plus, la commande renvoie l'ensemble des classes Wmi et Cim.</p>
<p> Pour cela 3 solutions pour s'y retrouver:</p>
<ul>
<li><u>renvoyer le tout dans un fichier texte,</u> le sauvegarder pour l'avoir sous la main puis un petit “<strong>ctrl + F”</strong> pour rechercher dans la liste.</li>
<p>Petite remarque: <code>Select-Object</code> permet de filtrer les informations de la commande en récupérant uniquement la partie CimclassName de <code>Get-CimClass</code></p>
<p> </p>
<ul>
<li><u>renvoyer le tout dans un GridView</u>, un outil, bien utile, fourni dans PowerShell .</li>
<p>C'est une Fenêtre, bien pratique, qui permet dans ce cas, de mettre directement sous forme de tableau, de filtrer ou de rechercher des éléments renvoyés par une commande.</p>
<p>Vous commencez certainement à vous dire POWAAA!! puissant le truc…</p>
<p>Connaitre à quoi servent toutes les requêtes WMI et les instances CIM serait un peu fou. C'est pourquoi, je vous renvoie vers ce <ahref="https://docs.microsoft.com/fr-fr/windows/win32/cimwin32prov/cimwin32-wmi-providers">lien</a> pour en connaitre leurs utilités et en savoir un peu plus sur ces classes.</p>
<p>Allez à vous de jouer! Essayez de récupérer des infos, comme par exemple sur la version de votre bios, la date de l'installation du système, le ou les disque(s) dur etc…</p>
<h1>Les variables</h1>
<p>Une variable PowerShell est un emplacement de stockage provisoire en mémoire destiné à recueillir une valeur, un objet ou une collection d’objets.<br>Les variables sont généralement nommées, et leurs noms sont toujours précédés d’un symbole “$“<br>Les variables sont automatiquement “typées” lors de l’affectation de valeur (si elles ne sont pas déclarées au préalable.)</p>
<p>Exemple :</p>
<p> </p>
<pre><codeclass="language-plaintext">$variable = une valeur </code></pre>
<p> </p>
<p>Avant de rentrer dans le vif de ce sujet, il faut savoir que sous PowerShell, il existe deux type de variables spécifiques générées automatiquement.</p>
<h2>Les variables automatiques</h2>
<p>Elles stockent l'état de votre système et sont gérées par PowerShell. Elles ne peuvent pas être modifiées.</p>
<p>Pour lister ces variables automatiques vous pouvez utiliser la commande:</p>
<p>Elles stockent la configuration de votre système et peuvent être modifiées. De manière très générale, elle permettent de définir le comportement de PowerShell dans certaines situations.</p>
<p>Vous comprenez, à présent pourquoi je vous ai parlé des variables automatiques et de préférences avant. En effet, la commande <code>Get-Variable</code> vous les liste toutes par noms et indique quelle(s) valeur(s) est stockée(s).Je met volontairement un “(s)” car elles peuvent parfois en contenir plusieurs. Lorsque nous verrons comment créer nos propres variables, elles viendront s'ajouter à cette liste.</p>
<p>Comme je vous l'ai indiqué en début de chapitre une variable se déclare par le sigle <strong>$ </strong>suivit de son <strong>nom</strong> puis vous pouvez lui affecter une <strong>valeu</strong>r avec le signe <strong>égal</strong>.</p>
<p>Il y possibilité sous PowerShell d'appliquer une méthode à cette variable. Par exemple, je peux demander à PowerShell de stocker le mot <code>papamica</code> en majuscule. Pour ce faire, je vais déclarer ma variable, puis faire appel à celle-ci par <strong>$nom et ajouter un point</strong> et lister l'ensemble des méthodes et propriétés de celle-ci.</p>
<p>Remarque: Sur la première ligne, vous constaterez que j'utilise <strong>“ " </strong>pour que PowerShell considère les éléments qui se trouve à l'intérieur comme une chaine de caractères. Sur la seconde ligne, j'écris <code>$unnom</code> pour que la valeur de ma variable s'affiche dans le prompt qui se trouve dans la fenêtre du bas.</p>
<p>Vous pouvez également remplacer une lettre voir une partie de votre valeur avec <code>.Replace()</code>.On constate, que certaines méthodes demandent des arguments dans les “<strong>()</strong>”.</p>
<p>On appelle la concaténation le fait de pouvoir associer ou grouper des caractères en une chaine. Par Exemple, si on souhaite intégrer la valeur d'une variable dans du texte. </p>
<p>Déclarons une variable <strong>$mot</strong>, on lui ajoute une valeur, puis jouons avec avec les commandes <code>Write-Host</code> (qui permet de renvoyer une chaine de caractères dans le prompt) et <code>Read-Host</code>(qui attends que l'on entre une valeur dans le prompt) pour concaténer. </p>
<p>Voyons ce que cela donne avec <code>Write-Host</code></p>
<p>On voit que l'analyse de <code>Write-Host</code> va récupérer la valeur de <code>$mot</code> et l'intégrer dans la chaine de caractère <strong>“j'apprends”.</strong></p>
<p>Vous remarquez que <code>$mot = Read-Host</code> attends et ensuite va stocker ce que vous écrivez dans le prompt. On peut ensuite le concaténer.</p>
<p>Je reviens un instant sur un cas particulier lorsque vous faites appel à une propriété ou une méthode de variable il y a une syntaxe un peux spécifique pour la concaténer.</p>
<p>deux solutions, à vous de choisir il n'y a pas forcement de règle puisqu'il n'y pas une seule et unique façon de faire un script :</p>
<p>Ici je stocke ma variable demandée dans le prompt avec <code>Read-host</code> puis je vais appliquer une transformation à ma variable avec <code>$mot = $mot.ToUpper()</code> en la réaffectant</p>
<p>Dans ce cas on applique en même temps la transformation de ma chaine de caractère contenu dans ma variable <code>$mot</code>, en stipulant de récupérer la valeur dans <code>$mot</code> avec <strong>$ puis les parenthèses</strong> et d'appliquer la transformation avec <code>$mot.ToUpper()</code> à la variable <code>$mot</code>.</p>
<p>Lorsque vous démarrer PowerShell, les variables sont hiérarchisées suivant le schéma Parent - Enfant. C'est à dire que les variables de la portée enfant ne pourront être employées dans la portée Parent. Un schéma pour vous illustrez tout ça :</p>
<p>Dans cette exemple, nous utilisons une fonction que nous verrons plus tard. Dans le bloc de script symbolisé par <strong>{}</strong> la variable $portee est bien lu par la fonction. Hors, à la ligne 8 le <code>Write-Host</code> ne peut pas lire cette variable. La variable $portee se limite aux <strong>{} </strong>.</p>
<p>Pour palier à ce soucis, on va indiquer à PowerShell que <code>$portee</code> est une variable dites globale par $global:portee</p>
<p>La variable de pipeline <code>$_.</code> est une variable un peu spécifique puisque celle-ci s'utilise derrière un pipeline. Pour illustrer son utilisation, nous allons récupérer tout les services avec <code>Get-Service</code> et filtrer avec <code>Where-Object</code> uniquement ceux qui sont stoppés. </p>
<p>Avec PowerShell, il est tout à fait possible d'utiliser des commandes pour gérer le comportement ou de donner des instructions à machine à distance. C'est ce que nous allons voir de deux façon différentes. Ensuite nous verrons comment utiliser PowerShell Direct pour gérer vos machines virtuel depuis un hôtes.</p>