Créer un lien symbolique sous PowerShell
Sommaire
I. Présentation
Dans ce tutoriel, nous allons apprendre à créer un lien symbolique avec PowerShell, sur une machine Windows.
Chez les linuxiens, cela se gère par la commande ln -s. Mais il n'existe pas une commande dédiée en PowerShell, c'est un peu plus subtil que ça... Mais en même temps logique.
Vous allez voir 😉
Il faut savoir qu'il existe la commande native "mklink" qui permet de créer un lien symbolique sous Windows. Néanmoins, nous ne sommes pas à l'abri que cette commande historique disparaisse : il est préférable de savoir le faire avec Powershell.
II. Prérequis
- Windows PowerShell version 5.1, ou PowerShell Core version 7+
III. À quoi ça sert un lien symbolique ?
Qu'est-ce que c'est que cette bête-là ? Et puis d'abord à quoi ça sert ?
Un lien symbolique, c'est un peu comme un raccourci sur votre bureau. Il s'agit d'un fichier un peu spécial qui pointe vers un autre fichier.
Concrètement, le fichier "lien symbolique" ne contient aucune donnée du fichier cible.
À noter que je parle de fichiers depuis tout à l'heure, mais on peut faire un lien symbolique aussi bien vers un répertoire qu'un fichier, que ceux-ci soient locaux à notre machine, ou accessibles à distance, sur un partage DFS par exemple.
Vous souhaitez un exemple concret d'utilisation ?
Ok, c'est parti 🙂
Sur mon PC Windows, j'utilise aussi bien Windows PowerShell (version 5.1) que PowerShell Core (version 7).
Il s'agit bien de deux versions de PowerShell différente et à ce titre, les fichiers de profils personnalisés sont différents.
Sauf que personnellement, je n'ai pas envie de gérer deux fichiers sur mon système : 1 seul profil est bien suffisant.
Du coup, j'ai stocké mon fichier profile.ps1 dans un répertoire sur ma machine, puis j'ai créé deux liens symboliques (1 pour Windows PowerShell, et 1 pour PowerShell 7) afin de pointer sur le même fichier.
Toujours dans la même logique, si je veux avoir le même environnement customisé sur les serveurs distants sur lesquels je me connecte, je peux créer un lien symbolique vers le dossier partagé sur lequel j'ai stocké ce profil, par exemple.
Un autre cas d'utilisation...
Dernier cas d'utilisation assez courant, si vous trackez vos fichiers de configuration via Git, vous pouvez mettre tous vos fichiers de configuration applicatifs dans un seul répertoire, par exemple Repos\Config.
Il vous reste ensuite pour chaque application à créer les liens symboliques pointant vers les fichiers de configuration stockés dans ce répertoire.
Plutôt pratique, pour deux raisons :
- Vous ne suivez qu'un dépôt Git. Vous appliquez ainsi le principe du Keep it easy.
- Vos liens symboliques pointant vers le dépôt Git, dès que vous mettrez celui-ci à jour, vos applications prendront immédiatement en compte les nouveaux fichiers de configuration. Plus d'opération de copier/coller manuelle à prévoir.
IV. Créer un lien symbolique sous PowerShell
Reprenons le cas concret du profil PowerShell. Pour savoir où ce profil est stocké, tapez la commande :
$profile.CurrentUserAllHosts
Dans mon cas, ayant lancé cette commande sous PowerShell 7, mon fichier profil est stocké à cet endroit :
C:\Users\Thibault\Documents\PowerShell\profile.ps1
Je me déplace donc dans mon dossier C:\Users\Thibault\Documents\, puis je vais vérifier si le dossier PowerShell existe :
Test-Path ./PowerShell
La réponse étant false, je vais créer ce dossier, ce qui me permettra par la suite de créer mon lien symbolique :
New-Item -ItemType Directory -Name PowerShell
Mais plutôt que de créer un fichier classique profile.ps1, nous allons cette fois créer le fameux lien symbolique, pointant sur le "vrai" fichier de configuration profile.ps1, stocké dans mon dépôt Git.
Comment ? Également via la commande New-Item. Et oui ! Cette même commande que l'on utilise pour créer nouveaux répertoires et nouveaux fichiers.
Note : Il vous faudra les droits d'administration pour créer un nouveau lien symbolique.
On va donc réutiliser la commande New-ItemType en indiquant cette fois comme ItemType un SymbolicLink :
New-Item -ItemType SymbolicLink -Path .\PowerShell\profile.ps1 -Target E:\Repos\config\PowerShell\profile.ps1
- Le paramètre -Path indique ici le nom du lien symbolique à créer. PowerShell attendant un fichier nommé profile.ps1 pour contenir mon environnement custom, je vais donc nommer comme cela mon lien symbolique.
- Le paramètre -Target indique le fichier cible sur lequel mon lien symbolique va pointer.
Si on vérifie le contenu du dossier PowerShell, on va effectivement voir un nouveau lien symbolique, qui va s'afficher de la manière suivante : <nom-du-lien-symbolique> -> <cible>
Et voilà, votre lien symbolique est créé.
Si vous ne me croyez pas, allez-y, il vous suffit de modifier le fichier cible pour que la modification soit prise en compte par votre application.
Fini les repository Git multipliés à outrance, vous pourrez maintenant centraliser tous vos fichiers de configuration sur un seul et même répertoire.
Elle n’est pas belle la vie ?
Cela serait bien de rendre à César ce qui appartient à César…
Je parle du profile PS personnalisé, à cette adresse : https://www.networkadm.in/customize-pscmdprompt/
yes, that is correct. the personalized profile is from an article on my site. Thanks for the shout out!
I have changed domain names, since this article was posted. Profile article can be found here:
https://commandline.ninja/customize-pscmdprompt/