Cmdlet Test-Path de PowerShell : Vérifier les fichiers, les clés et plus encore

Si vous avez besoin de valider un chemin vers un fichier, une clé de registre, un certificat, ou tout autre chemin de PowerShell drive, vous avez besoin de la cmdlet Test-Path.

La cmdlet Test-Path est un moyen simple mais utile pour vérifier rapidement de nombreuses propriétés d’un fichier et d’autres éléments. Elle peut vérifier si un fichier existe (ou d’autres types d’éléments), si une chaîne est dans le format de chemin correct, ou même si un élément est plus récent ou plus ancien qu’un temps spécifique.

Dans ce tutoriel, vous allez tout apprendre sur la cmdlet PowerShell Test-Path et comment l’utiliser pour améliorer vos scripts PowerShell.

Prérequis

Si vous souhaitez suivre les exemples de ce tutoriel, vous aurez besoin d’une chose : PowerShell. Plus précisément, le tutoriel utilisera PowerShell v7.03 sur Windows 10, bien que de nombreuses techniques que vous apprendrez s’appliqueront également aux versions plus anciennes.

Que fait la cmdlet Test-Path ?

La cmdlet PowerShell Test-Path est l’une des commandes les plus simples. C’est une commande qui existe dans PowerShell depuis le début et ne renvoie que deux valeurs : Vrai ou Faux.

Mais ne laissez pas sa simplicité vous tromper ; elle vous fera gagner tellement de temps dans la validation des informations dans vos scripts PowerShell.

Pensez à la cmdlet Test-Path de PowerShell comme à un contrôle de qualité lors de l’utilisation des fournisseurs et des lecteurs PowerShell. Lors de l’écriture d’un script, vous travaillerez fréquemment avec divers éléments contenus dans les lecteurs PowerShell. Des lecteurs PowerShell tels que C:\, HKLM, Cert, et ainsi de suite.

Test-Path ne fonctionne pas avec tous les lecteurs PS. Par exemple, si vous tentez d’utiliser Test-Path sur une clé de registre, cela fonctionnera. Si vous tentez d’utiliser Test-Path sur une valeur de registre, cela renverra False à chaque fois.

Si cela vous intrigue, exécutez maintenant la cmdlet Get-PSDrive dans PowerShell et remarquez tous les lecteurs PS qui apparaissent pour vous.

PS Drives after running Get-PSDrive

Tous ces lecteurs ont des chemins à l’intérieur d’eux comme C:\Windows, HKLM:\Software, etc. Lorsque vous travaillez avec des chemins à l’intérieur de vos scripts PowerShell, il est toujours bon de tester d’abord si le chemin est valide ou s’il existe ou non. C’est ce que fait Test-Path de PowerShell.

Test-Path définit une condition qui renvoie True ou False en fonction de la satisfaction d’une condition spécifique (généralement si un fichier/dossier, une clé de registre, un certificat, ou même une variable existe ou non).

Paramètres et utilisation de Test-Path

Comme de nombreux autres cmdlets PowerShell, le cmdlet Test-Path possède divers paramètres qui modifient son comportement. Couvrons maintenant chaque paramètre et démontrons comment il fonctionne et quels types de résultats vous pourriez vous attendre à voir.

Chemin

Le paramètre Chemin est un paramètre obligatoire que vous utiliserez à chaque exécution de Test-Path. Le paramètre Chemin définit le chemin du PSDrive que vous souhaitez tester pour savoir s’il existe.

Par exemple, si vous souhaitez vérifier si le dossier C:\Foo existe ou non, vous fournirez le chemin approprié au paramètre Chemin. Ensuite, en fonction de si C:\Foo existe réellement ou non, Test-Path renverrait soit Vrai soit Faux.

PS> Test-Path -Path 'C:\Foo'
True

La même technique peut être utilisée pour n’importe quel chemin d’élément également. Peut-être souhaitez-vous vérifier si la clé de registre HKLM:\Software\Foo existe ou non. Utilisez simplement le chemin de la clé de registre avec le paramètre Chemin.

PS> Test-Path -Path 'HKLM:\Software\Foo'
True

Sachez que toutes les techniques démontrées tout au long de ce tutoriel fonctionneront avec n’importe quel chemin de lecteur PowerShell.

Utilisation de jokers

Que se passe-t-il si vous ne vous souciez pas nécessairement si un chemin a une valeur littérale. Au lieu de cela, vous souhaitez simplement vérifier si un chemin correspond à un motif spécifique. Dans ce cas, vous pouvez utiliser des jokers dans la valeur du Chemin.

Peut-être souhaitez-vous vérifier si votre dossier C:\Foo contient un sous-dossier qui commence par Bar. Dans ce cas, vous pourriez utiliser un joker.

PS> Test-Path -Path 'C:\Foo\Bar*'

Une fois que vous exécutez la commande ci-dessus, Test-Path vérifiera l’existence du dossier any qui commence par Bar et renverra True ou False en fonction de l’existence ou non d’un dossier correspondant à ces critères.

Les astérisques (*) correspondent à un ou plusieurs caractères, mais vous pouvez également utiliser des points d’interrogation (?) pour une correspondance plus précise et tester pour un seul caractère.

En utilisant le scénario ci-dessus comme exemple, si le dossier C:\Foo\Bar1 existe, vous pouvez tester la présence de tout sous-dossier de Foo qui commence par Bar et a exactement quatre caractères en utilisant la commande ci-dessous.

PS> Test-Path -Path 'C:\Foo\Bar?'

Si, pour une raison quelconque, vous souhaitez utiliser le paramètre Path avec des caractères génériques mais que vous voulez correspondre littéralement à un caractère générique comme *, vous pouvez toujours échapper les caractères génériques avec un accent grave (`).

LiteralPath

Le paramètre LiteralPath est presque identique au paramètre Path à une exception près ; il n’accepte pas les caractères génériques. En utilisant LiteralPath, le chemin est interprété littéralement.

Par exemple, si vous tentez d’utiliser un astérisque ou un point d’interrogation à l’intérieur de la valeur du chemin avec LIteralPath, Test-Path ignorera complètement les caractères génériques et testera littéralement pour C:\Foo\Bar? comme dans l’exemple ci-dessous.

PS> Test-Path -LiteralPath 'C:\Foo\Bar?'

Vous devriez utiliser LiteralPath comme le paramètre de chemin par défaut si vous n’avez pas besoin d’utiliser des caractères génériques pour vous assurer que Test-Path teste le chemin attendu.

PathType

Par défaut, lorsque vous exécutez Test-Path et lui fournissez un chemin, il renverra True s’il trouve quelque chose dans ce chemin. L’élément avec un chemin pourrait être un conteneur comme un dossier de fichiers, une clé de registre, un magasin de certificats, etc., ou une feuille comme un fichier, une valeur de registre ou un certificat.

Vous pouvez forcer Test-Path à être plus précis et à tester spécifiquement un conteneur ou un élément feuille en utilisant le paramètre PathType.

Par défaut, Test-Path utilise la valeur Any pour PathType.

Si, par exemple, il y a un dossier à C:\Foo\Bar et que vous cherchez un fichier à ce chemin, vous pourriez utiliser le paramètre PathType comme indiqué ci-dessous. Vous voulez juste vérifier si un fichier appelé C:\Foo\Bar existe.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Leaf

Peut-être que vous avez besoin de confirmer si C:\Foo\Bar est réellement un fichier. Dans ce cas, vous vérifieriez un conteneur.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Container

Inclure

Si vous utilisez le paramètre Path et des jokers, vous devrez parfois être plus spécifique. Dans ce cas, vous devez examiner les paramètres Include et Exclude.

Disons que vous avez les dossiers suivants:

  • C:\Foo\Bar1
  • C:\Foo\Bar2
  • C:\Foo\Bar3

Vous souhaitez vérifier si un dossier commençant par Bar existe et s’il est exactement composé de quatre caractères comme Bar1, Bar2, etc.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container

La commande ci-dessus fonctionne bien, mais maintenant vous voulez seulement trouver des dossiers dans C:\Foo nommés Bar2. Dans ce cas, vous pourriez utiliser le paramètre Include.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container -Include 'Bar2'

Le commandement ci-dessus teste désormais essentiellement un seul dossier C:\Foo\Bar2. Il serait probablement plus judicieux d’utiliser simplement Test-Path -Path 'C:\Foo\Bar2' -PathType Container à la place.

Exclude

Le paramètre Exclude fonctionne de manière similaire au paramètre Include, sauf que cette fois-ci, il exclut les chemins correspondant à une chaîne.

Peut-être souhaitez-vous vous assurer qu’il y a au moins un fichier à l’intérieur du dossier C:\Foo, et vous utilisez la commande suivante:

PS> Test-Path -Path C:\Foo\* -PathType Leaf

La commande ci-dessus renvoie True ou False si des fichiers se trouvent dans C:\Foo. Mais peut-être souhaitez-vous vous assurer que des fichiers autres que ceux avec une extension de fichier txt existent. Dans ce cas, vous pourriez utiliser le paramètre Exclude avec un joker pour exclure tous les fichiers avec l’extension txt du test.

PS> Test-Path -Path C:\Foo\* -PathType Leaf -Exclude *.txt

Filter

Selon la documentation de Microsoft, le paramètre Filter « spécifie un filtre dans le format ou le langage du fournisseur. La valeur de ce paramètre se qualifie en tant que paramètre Path. La syntaxe du filtre, y compris l’utilisation de caractères génériques, dépend du fournisseur ».

Bien que le paramètre Filter devrait être utilisé avec d’autres cmdlets comme Get-Childitem, par exemple, il est rarement, voire jamais, utilisé avec Test-Path. Si vous avez trouvé une bonne utilisation pour le paramètre Filter, veuillez me contacter sur Twitter à @adbertram.

Lié : Get-ChildItem : Afficher les fichiers, le registre, les certificats et plus encore comme un seul

NewerThan

Avez-vous déjà eu besoin de vérifier l’horodatage d’un fichier et de prendre une décision en fonction de cela ? Si oui, les paramètres NewerThan et OlderThan économisent beaucoup de code. Le paramètre NewerThan vérifie si l’horodatage d’un élément est plus récent qu’une date spécifique.

Le paramètre NewerThan accepte une chaîne de caractères ou un objet DateTime pour représenter un horodatage à vérifier. Par exemple, pour vérifier si le fichier C:\Foo\bar.txt a été créé après le 20 janvier 2021, vous exécuteriez Test-Path comme ci-dessous.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan 'January 20, 2021'
## ou
Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan '1/20/21'

OlderThan

Le paramètre OlderThan est exactement le même que le paramètre NewerThan mais opposé. Ce paramètre vérifie si un élément est plus vieux qu’une date spécifique.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan 'January 20, 2021'
## ou
Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan '1/20/21'

IsValid

Si vous avez déjà construit dynamiquement un chemin dans un script, vous connaissez la difficulté. Parfois, vous pouvez appuyer accidentellement sur une touche ou obtenir un caractère spécial dans un chemin ; si c’est le cas, le paramètre IsValid est pour vous.

Le paramètre IsValid est un paramètre unique qui transforme Test-Path, non pas en une cmdlet qui vérifie l’existence d’un élément, mais en une qui vérifie la syntaxe du chemin. Ce paramètre confirme si un chemin est valide uniquement.

Par exemple, peut-être devez-vous vérifier si un chemin est syntaxiquement valide. Vous travaillez avec quelques variables et les concaténez pour construire un chemin.

Lors de la concaténation des chemins, utilisez toujours la cmdlet Join-Path. Cela n’est donné qu’à titre d’exemple!

$someVar = 'abc:dff'
$rootPath = 'C:\'
$path = "$someVar$rootPath

Maintenant, pour vous assurer que le chemin que vous avez créé dynamiquement est valide, utilisez le paramètre IsValid comme ci-dessous. Vous constaterez que Test-Path renvoie False.

PS> Test-Path -LiteralPath $path -IsValid
False

Le chemin abc:dffC:\ n’est pas un chemin valide, vous permettant ainsi de créer une routine de validation à partir de cette situation.

Si vous utilisez PowerShell v6.1.2 ou une version antérieure et que vous utilisez les paramètres IsValid et PathType ensemble, Test-Path ignorera le paramètre PathType.

Credential

Même si vous trouvez le paramètre Credential sur Test-Path, vous pourriez penser que vous pouvez l’utiliser pour vous authentifier auprès des disques PS en tant qu’autre utilisateur. C’est une hypothèse valide, mais incorrecte.

Malheureusement, le paramètre Credential n’a pas beaucoup d’effet avec la cmdlet Test-Path. Microsoft recommande d’utiliser la cmdlet Invoke-Command et d’utiliser le paramètre Credential là-bas si vous voulez invoquer Test-Path avec des informations d’identification alternatives.

Invoke-Command -Credential (Get-Credential) -Scriptblock {Test-Path -LiteralPath 'C:\'}

Connexe: Invoke-Command : La meilleure façon d’exécuter du code à distance

Source:
https://adamtheautomator.com/powershell-test-path/