Profils PowerShell
Introduction
La notion de profil est une notion familière des IT Pros que nous sommes car il en est question depuis longtemps dans Windows avec, entre autres, le fameux « profil Windows » (qui peut être local ou itinérant), ainsi que le profil Outlook. Un profil est simplement un fichier (ou un ensemble de fichiers) qui contient les préférences de l’utilisateur.
Il faudra désormais composer avec des profils supplémentaires, ceux de PowerShell. Et ils peuvent être nombreux car nous pouvons en créer jusqu’à une dizaine différents si nous le souhaitons ! Les profils PowerShell sont tout simplement des scripts exécutés automatiquement au démarrage de la console PowerShell, et ce dans un ordre bien précis. Ils permettent de configurer notre environnement PowerShell pour par exemple charger automatiquement des fonctions ou positionner certaines variables. Nous verrons plusieurs cas d’utilisation dans ce chapitre.
Une notion importante à connaître associée aux profils PowerShell est la notion « d’hôte ». Un hôte est un environnement d’exécution de PowerShell.
De base, nous connaissons deux hôtes qui sont la console classique et la console graphique ISE, mais il en existe cependant beaucoup d’autres tels que Visual Studio Code, feu PowerGUI, etc. Chacun...
Profils disponibles
Nous pouvons déterminer la liste des profils utilisables dans l’hôte courant - ici la console Windows PowerShell standard - grâce à la commande suivante :
PS > $profile | Format-List * -force
AllUsersAllHosts : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost : C:\Windows\System32\Wind
owsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts : C:\Users\Arnaud\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\Arnaud\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length : 80
Nous pouvons remarquer que quatre profils différents s’offrent à nous. Nous verrons un peu plus loin à quoi correspondent chacun de ces profils. Notez que bien qu’ils soient référencés dans la variable $profile, aucun de ces fichiers n’est créé. Ce sera à vous de le faire.
La même ligne de commandes appliquée dans l’environnement ISE nous retourne un résultat légèrement différent :
PS > $profile | Format-List * -force
AllUsersAllHosts :
C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost...
Ordre d’application des profils
L’ordre d’application des profils est important, PowerShell les applique dans l’ordre suivant :
1. AllUsersAllHosts
2. AllUsersCurrentHost
3. CurrentUserAllHosts
4. CurrentUserCurrentHost
Comme d’habitude ce sont les paramètres les plus proches de l’utilisateur qui sont prioritaires et donc qui s’appliquent en dernier. Par exemple, si vous définissez plusieurs fois la même variable dans vos profils, ce sera la dernière définition qui aura le dernier mot.
Création d’un profil
Par défaut, aucun profil n’est créé. La méthode la plus simple pour créer son profil consiste à s’appuyer sur la variable $profile. Effectivement, comme nous l’avons vu précédemment, cette variable contient dans ses propriétés les chemins vers les différents profils pris en charge par PowerShell.
Créons à présent un profil qui sera commun à toutes les consoles (ou hôtes) mais qui ne s’appliquera qu’à nous-mêmes. Pour ce faire, nous devons choisir la propriété CurrentUserAllHosts de la variable $profile.
Vérifions d’abord vers quel emplacement pointe cette propriété :
PS > $profile.CurrentUserAllHosts
C:\Users\Arnaud\Documents\WindowsPowerShell\profile.ps1
Pour créer votre profil, tapez la commande :
PS > New-Item -Path $profile.CurrentUserAllHosts -ItemType file -Force
-force permet ici de créer l’arborescence de dossiers si celle-ci n’est pas présente lors de la création du fichier.
Félicitations, votre profil est maintenant créé mais il ne pèse que zéro octet car il est vide. Pour le modifier à l’aide de l’éditeur graphique ISE, tapez la commande suivante :
PS > ise $profile.CurrentUserAllHosts
Personnalisation de l’environnement
Tout ce que nous allons voir maintenant est fait pour être inclus dans votre profil. À vous de choisir ce qui sera le plus approprié à votre besoin.
1. Modification du prompt
Le prompt ou invite est l’ensemble des caractères qui indique que l’ordinateur est prêt à recevoir une saisie au clavier.
Par défaut il est de la forme suivante : PS CHEMIN_COURANT>
Vous vous trouvez au démarrage de PowerShell dans le répertoire racine de votre profil Windows, soit sous Windows 10 et Windows Server 2016 : C:\Users\NomDeL’utilisateur
Voici le prompt par défaut :
Prompt par défaut au démarrage de la console
PowerShell Core vous positionne par défaut dans le répertoire d’installation, soit sous Windows C:\Program Files\PowerShell\6.0.0.
Pour modifier l’invite, il suffit de redéfinir la fonction Prompt de PowerShell. Voyons d’abord ce qu’elle contient dans sa configuration d’origine. Pour visualiser son contenu, nous allons faire appel au provider Function grâce à son lecteur function: comme ci-après :
PS > Get-Content function:prompt
"PS $($executionContext.SessionState.Path.CurrentLocation)`
$('>' * ($nestedPromptLevel + 1)) "
# .Link
# http://go.microsoft.com/fwlink/?LinkID=225750
# .ExternalHelp System.Management.Automation.dll-help.xml
La fonction Prompt fait appel à la variable automatique $executionContext représentant le contexte d’exécution de l’hôte courant. En la regardant de plus près, on peut comprendre les choses suivantes :
-
Elle récupère le chemin courant (0).
-
Elle duplique le caractère > autant de fois que le niveau de prompt actuel (1).
-
Elle concatène les chaînes précédentes pour obtenir une chaîne comme ceci : PS (0)(1)
$nestedpromptlevel indique si nous nous trouvons dans un environnement imbriqué. Si cette variable contient un nombre supérieur à zéro, cela signifie que nous nous trouvons dans un environnement imbriqué (cas particulier lorsque l’on fait du débogage).
Il est très facile de redéfinir la fonction Prompt, ainsi nous pouvons par exemple décider de supprimer...
Exécuter PowerShell sans profil
Dans certains cas, il est nécessaire de lancer PowerShell sans profil afin de ne pas allonger inutilement le temps d’ouverture de la console et/ou pour être sûr de ne pas perturber le bon déroulement d’un script. Ceci constitue notamment une bonne pratique lors d’exécution de scripts PowerShell via une tâche planifiée.
Les exécutables PowerShell.exe (Windows PowerShell) et pwsh.exe (PowerShell Core) possèdent pour ce faire le paramètre -Noprofile.
Ainsi, nous pouvons écrire, par exemple, la ligne de commandes suivante pour démarrer PowerShell en ignorant tout profil et exécuter monScript.ps1 :
PS > pwsh.exe -noprofile -file ./monScript.ps1
Il existe de nombreux autres paramètres disponibles. Pour en obtenir la liste exhaustive, tapez powershell.exe /? ou pwsh;exe / ?.