Ce sera un court post concernant une question que je reçois ou que je vois posée assez fréquemment et qui mérite d’être écrite.
PowerShell Check if folder exists
Parfois, lors de l’interaction avec le système de fichiers, par exemple lors de l’écriture d’un fichier journal sur le disque, il est important de s’assurer que le dossier de destination vers lequel nous allons écrire les fichiers existe réellement pour éviter que PowerShell ne lève une exception ou, pire, ne perde des données.
PowerShell et PowerShell Core disposent d’une cmdlet native pour vérifier l’existence d’un chemin donné
Test-Path -Path 'C:\Temp\'
La cmdlet Test-Path prendra un chemin en argument et retournera un True (valeur booléenne) si le chemin donné existe. Cela peut facilement être utilisé dans des scripts pour vérifier si un dossier donné existe et le créer si ce n’est pas le cas comme dans l’exemple suivant
# Define where to store logs$logPath = 'C:\MyLogPath\'# Create folder if does not existif (!(Test-Path -Path $logPath)){ $paramNewItem = @{ Path = $logPAth ItemType = 'Directory' Force = $true } New-Item @paramNewItem}
C’est quelque chose que je fais si souvent que je l’ai mis dans un de mes modèles de script pour ne pas avoir à m’en soucier à chaque fois que j’écris du code pour un nouveau script.
Vérifier si le dossier existe à la .Net Way
Le cmdlet Test-Path appelle une fonction .Net intégrée sous le capot, au cas où vous voudriez impressionner vos amis, ce qui précède peut être réécrit comme ceci
# Define where to store logs$logPath = 'C:\MyLogPath\'# Create folder if does not existif (!(::Exists($logPath)){ ::CreateDirectory($logPath)}
Notes de conclusion
Les deux méthodes pour vérifier si un dossier existe que j’ai décrites dans l’article sont équivalentes. La deuxième approche est légèrement plus performante mais risque de rendre votre code moins lisible.
Compte tenu du gain de performance négligeable, j’ai tendance à préférer la première méthode car rend le code beaucoup plus clair pour quelqu’un qui reprend ou modifie mon travail.