Bien débuter avec Powershell

Introduction

Ce petit article sans prétention, s’adresse aux débutants et peut être aussi à ceux qui souhaitent affuter leur connaissances de Powershell.

La compétence ne s’acquiert qu’avec la pratique et l’idée présentée ici consiste simplement à vous inciter à l’utilisation de Powershell au quotidien, en abandonnant d’anciennes habitudes, tout en y apportant quelques petites touches personnelles.

 Cette démonstration s’appuie sur un système Windows 10 x64 ou Server 2016/19 mais peut être extrapolée à d’autres versions.

Accès rapide à la console

Commencez par modifier le menu rapide via [⊞ Win] + [X] ou clic droit sur l’icône du menu “Démarrer

Bouton Demarrer

Pour cela, allez dans le menu “Paramètres

Puis entrez “Powershell” dans la zone de saisie et cliquez sur l’option “Remplacer l’invite de commandes ….

Puis activez l’option via le bouton bascule.

Le changement doit être immédiat

Et maintenant, pour ouvrir rapidement une console Powershell en mode admin, il vous suffit d’utiliser la combinaison des touches

[Win]+[X] puis [A]

Il vous restera à valider l’élévation de privilèges UAC et c’est tout 😀

Voilà, vous êtes paré pour remiser l’invite de commande tradionnel au placard et utiliser la console Powershell au quotidien …

En cas de difficultés avec la syntaxe d’une ancienne commande, préfixez la simplement par “cmd /c …

Les alias

Comme je le précise souvent dans mes formations, les alias sont à utiliser avec parcimonie pour les débutants. En effet, ils peuvent vite s’avérer de faux-amis, et peuvent freiner le changement d’anciennes habitudes.

Il sera plus rapide d’utiliser “ls” ou “dir” au lieu de “get-childitem” mais au niveau des commutateurs, la réalité vous rattrape, et vous devrez alors “penser” en logique Powershell. Les habitudes sont tenaces, mais dans ce cas, profitez-en pour apprendre de nouveaux alias tels que “gci“. 😀

Vous pouvez énumérer les nombreux alias via “get-alias” ou bien énumérer le contenu du lecteur dédié “alias:” (PSDrive). La encore, en mode script, il est préférable d’éviter l’usage des alias ou profit des commandes complètes, qui améliorent naturellement la lisibilité du code. En revanche, ils sont parfaitement appropriés à la console ainsi qu’a l’écriture des “one-liner” (enchainement de commandes au sein d’un ou plusieurs pipelines)

Hormis les alias ressemblant aux commandes traditionnelles, quelques uns d’entre eux deviennent rapidement incontournables au sein de la console.

Les aides mémoire

helpGet-HelpSollicite l’aide Powershell intégrée
gcmGet-CommandInforme du l’origine d’une commande
gmGet-MemberInforme sur le type et la composition d’un objet
gmoGet-ModuleAffiche les modules chargés et/ou disponibles
galGet-AliasEnumère les alias (= “gcm -CommandType alias” ou “ls alias: “)

La crème des pipelines

%Foreach-ObjectBoucle de traitement d’une collection
?Where-ObjectEffectue un filtrage par critère
selectSelect-ObjetEffectue une sélection de membres d’un objet
slsSelect-StringEffectue une recherche dans un contenu (~ grep)
flFormat-ListAffiche l’objet sous forme de liste
ftFormat-TableAffiche l’objet sous forme d’un tableau

Et ensuite, les 2 seuls alias disposant de leur propre fenetre.

Les marginaux

isePowershell_ise.exeEditeur graphique de script (Integrated Scripting Environment)
ogvOut-GridViewAffiche l’objet au sein d’une grille graphique et interactive

Mais ces préférences restent bien évidement propres à chacun.

Pour lancer mon éditeur Powershell, en mode administrateur, je procéde ainsi :

[Win]+[X] , [A], puis ISE

Pour trouver rapidement un service, on peut entrer ce simple chainage

gsv | ogv

puis utiliser les capacités de filtrage de la sortie graphique.

Powershell, c’est aussi l’intéraction de ces mondes que tout semble opposer

et un allié au quotidien, Alors convaincu ou pas ?

Les profils

Au sens Powershell, un “profil”  est en fait un script (de personnalisation) qui exécute des actions de notre choix (commandes) au démarrage de  l’interpréteur (alias $Host). Disposant de plusieurs “Hôtes” (Console et ISE), on dispose donc d’une déclinaison de profil pour chaque environnement. De plus, un profil peut être spécifique et propre à un utilisateur mais un autre profil peut être commun à l’ensemble des utilisateurs d’une même machine.

Le profil personnel

Powershell utilise la variable automatique $PROFILE pour référencer les noms et chemins des profils.

Vous pourrez constater, cette variable référence par défaut le nom et chemin complet du script de profil personnel de l’utilisateur courant.

Attention, les exemples qui suivent engendrent des résultats différents selon le contexte (Hôte) à partir duquel vous exécutez les commandes (Console // ISE, mais aussi architecture 32 et//ou 64 bits).

Cette variable pointe vers un simple nom,  mais le fichier référencé n’existe pas par défaut.

Test-Path $PROFILE

Pour créer rapidement votre propre profil, il suffit de tapez la commande suivante :

New-Item -Path $PROFILE -Type File -Force

L’option “-force” permet de créer le répertoire parent s’il n’existe pas. Il vous suffira ensuite d’éditer son contenu, comme par exemple “notepad $PROFILE” puis d’y ajouter vos commandes préférées.

Exemple de code :

if (Test-Path $PROFILE) 
{
   Write-Host "Un fichier de profil personnel Powershell existe [$(Split-Path -Leaf $PROFILE)]"
   $Reponse = Read-Host "Souhaitez-vous l'éditer (o/n) ?"
   if ($Reponse -like 'o*') { Invoke-Item $PROFILE }
  } else {
   Write-Host "Le fichier de profil personnel Powershell n'existe pas dans cet environnement."
   $Reponse = Read-Host "Souhaitez-vous le créer puis l'éditer (o/n) ?"
   if ($Reponse -like 'o*') { New-Item -Path $PROFILE -Type File -Force -Verbose ;
                              Invoke-Item $PROFILE }
}

Les autres profils

En réalité, cette variable automatique $PROFILE référence plusieurs profils, selon l’environnement (Console ou ISE) et soit pour tous les utilisateurs soit propre à l’utilisateur courant.

Utilisez la commande suivante pour lister tous les 4 chemins de profil (9 au total si on considère les déclinaisons liées architectures 32 et 64 bits)

$PROFILE | select *
Déclinaison $PROFILEPrécisions – Emplacement du fichierNomNb. Max
AllUsersAllHosts(32 / 64) – Sous dossier $PSHOME  Profile.ps12
AllUsersCurrentHostISE/Console (32 / 64) – Sous dossier $PSHOME  Microsoft.PowerShellISE_profile.ps1 Microsoft.PowerShell_profile.ps14
CurrentUserAllHostsSous  dossier “documents” [environment]::getfolderpath(“mydocuments”) Profile.ps1  1
CurrentUserCurrentHostISE/Console – Sous  dossier “documents”Microsoft.PowerShellISE_profile.ps1 Microsoft.PowerShell_profile.ps12

L’ordre des profils

Bien qu’il soit assez rare d’avoir à gérer plusieurs profils, il convient d’en connaitre l’ordre d’exécution afin d’éviter les surprises 🙂

OrdreS’applique àChemin du profil
1Tous utilisateurs et tout hôte (Console et ISE)$PROFILE.AllUsersAllHosts
2Tous utilisateurs et hôte courant$PROFILE.AllUsersCurrentHost
3Utilisateur courant et tout hôte (Console et ISE)$PROFILE.CurrentUserAllHosts
4Utilisateur courant et hôte courant$PROFILE.CurrentUserCurrentHost

Aparté  dot sourcing

Notez que les scripts profils sont exécutés en mode “dot sourcing”. Autrement dit les fonctions et variables qu’ils contiennent seront disponibles dans la session et les éventuels scripts que vous exécuterez à partir de cet environnement.

Pour tester votre profil d’utilisateur, fermez puis rouvrez la session, ou exécutez-le en “dot sourcing”  (ajout d’un point et espace devant la commande) comme suit :

. $PROFILE

Ceci fonctionne également pour chaque profil sous réserve qu’il existe et que vous  précisiez le nom 🙂

. $PROFILE.CurrentUserCurrentHost

Vous pouvez également tester l’existence de différents profils via la commande suivante :

$profile.PSObject.Properties.Name |
   Where-Object { $_ -ne 'Length' } |
      ForEach-Object { [PSCustomObject]@{Profile=$_; 
                       Present=Test-Path $profile.$_; 
                       Path=$profile.$_}
                     }  

Exemple de personnalisation d’un profil Powershell

Il appartient à chacun de définir (ou non) un profil Powershell en fonction de ses habitudes personnelles mais je pense que le sujet des profils est peut être l’occasion de mettre en lumière une variable automatique méconnue $PSDefaultParameterValues.

Cette variable permet de modifier les options par défaut des commandes de votre choix., comme par exemple :

$PSDefaultParameterValues.Add("Get-Help:ShowWindow",$True)
$PSDefaultParameterValues.Add("Get-ChildItem:Force",$True)
$PSDefaultParameterValues.Add("Receive-Job:Keep",$True)
$PSDefaultParameterValues.Add("Format-Table:AutoSize",{if ($host.Name -eq "ConsoleHost"){$true}})
$PSDefaultParameterValues.Add("Test-Connection:Quiet",$True)
$PSDefaultParameterValues.Add("Test-Connection:Count","1")
$PSDefaultParameterValues.Add("*:Confirm",$false) # !! supprime toute demande de confirmation

Voilà, j’espère que ce petit tour d’horizon vous permettra d’exploiter plus efficacement Powershell. La compétence viendra avec le temps et la pratique 😉

Bonne continuation

Christophe M.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.