Dans ce petit article, je décris comment utiliser la cmdlet Test-Path pour vérifier si un fichier existe – ainsi qu’une alternative .NET qu’un collègue a dû utiliser une fois dans un certain contexte SCOM. Tapez Get-Help Test-Path pour plus d’informations, éventuellement avec le commutateur « -online ». Je fais également une démonstration rapide de la méthode de classe .NET Exists() de la classe System.IO.File.
Je démontre également comment créer un nouveau fichier s’il n’en existe pas actuellement et je montre comment gérer gracieusement les échecs de création du fichier.
La documentation officielle en ligne de Microsoft se trouve ici à ce lien.
Tweet
Comment vérifier si un fichier existe avec PowerShell
Vous pouvez utiliser quelque chose comme ceci pour la vérification sur la ligne de commande :
PS C:\> Test-Path C:\WindowsTrue
Sachez que vous avez besoin de guillemets si le chemin d’accès contient des espaces, des parenthèses – et peut-être d’autres caractères auxquels je ne peux pas penser maintenant. PowerShell ajoute automatiquement des guillemets lorsque vous complétez la tabulation. Je recommande d’utiliser des guillemets simples, car les guillemets doubles « développent » les variables (surtout pertinent si vous avez « $ » dans le chemin).
PS C:\> Test-Path -Path 'C:\Program Files'True
Sinon, vous verrez quelque chose comme ceci:
PS C:\> Test-Path C:\Program FilesTest-Path : A positional parameter cannot be found that accepts argument 'Files'.
Pour s’assurer explicitement qu’il s’agit d’un fichier et non d’un répertoire, utilisez le paramètre -PathType qui a les valeurs possibles suivantes :
- Any
- Leaf (fichier)
- Container (répertoire/dossier)
Exemple de capture d’écran
Utilisation du script
Dans un script, vous l’utiliseriez généralement dans une instruction if. Pour nier et vérifier si le dossier ou le fichier n’existe pas, utilisez soit » ! » soit « -not », et n’oubliez pas de mettre l’instruction Test-Path entre parenthèses.
N’oubliez pas non plus que si le chemin d’accès ou le nom du fichier contient un espace, vous devez entourer le chemin d’accès entier entre guillemets. Les guillemets simples ou doubles fonctionneront de la même manière s’il n’y a pas de parties « extensibles » dans le chemin ou le nom de fichier, mais le choix légèrement plus sûr est celui des guillemets simples. C’est ce que PowerShell utilise par défaut lorsque vous complétez automatiquement les noms avec une tabulation à l’invite.
Vous devez également prendre conscience de la différence entre -Path et -LiteralPath. Ce dernier prendra le chemin littéralement, comme son nom l’indique, tandis que le premier prend en charge la syntaxe joker. Ceci est souvent découvert par accident lorsque quelqu’un rencontre un fichier avec des parenthèses inégales, car cela fait partie de la même syntaxe que -like utilise, comme dans pour un chiffre hexadécimal. Cela entraîne des messages d’erreur, du moins sur les versions antérieures de PowerShell, lorsque vous utilisez -Path. Pour lister les structures de répertoire à partir d’un répertoire racine, utilisez -LiteralPath. Et à moins que vous n’ayez besoin de la prise en charge des caractères génériques, c’est le choix le plus sûr.
Créer un fichier s’il n’existe pas
Vous pouvez utiliser la cmdlet Set-Content pour créer un nouveau fichier s’il n’existe pas actuellement.
Voir mes exemples et Get-Help Set-Content ou Microsoft Docs en ligne ici à ce lien.
Vous pouvez également utiliser Out-File et d’autres méthodes que je ne prendrai pas la peine d’élaborer ici.
Bien sûr, vous pouvez utiliser une $Variable avec le nom du fichier à la place du texte codé en dur ici.
Ceci ne fait que créer un fichier avec une chaîne vide comme contenu.
Ou vous pouvez le faire comme ceci si vous travaillez en ligne de commande ou si cela vous arrange:
"" | Set-Content x:\path\filenamehere.xml
Je me suis dit qu’il était bon de démontrer d’abord ce qui est probablement considéré comme la façon la plus correcte d’utiliser le script.
Si vous voulez tester les échecs de création du fichier, vous pouvez utiliser une instruction try {} catch {} accompagnée du paramètre et de la valeur « -ErrorAction Stop » à la cmdlet créant le fichier, par ex.par exemple, Set-Content ou Out-File.
Voici un exemple rapide :
Voir c’est croire souvent (parfois à tort, mais c’est une autre histoire), voici donc un vidage d’écran de PowerShell ISE exécutant cet exemple stocké dans un fichier script .ps1.
Enumération des valeurs possibles de PathType
Un petit » truc » pour voir les valeurs d’énumération possibles pour -PathType est d’en utiliser une qui n’existe pas, comme ceci :
Et on remarque la partie où il est écrit :
The possible enumeration values are "Any, Container, Leaf".
Utilisation de la classe .NET System.IO.File Method « Exists »
Vous pouvez également utiliser la méthode Exists() de la classe .NET System.IO.File:
PS E:\temp> ::Exists('E:\temp\csv1.csv')True
Dans PowerShell, l’espace de nom « System » est facultatif, vous pouvez donc simplement utiliser « Io.File » également.
Une chose à savoir, c’est qu’avec cette méthode, vous avez besoin d’un chemin complet. Pour vérifier si un fichier est dans le répertoire actuel avec la méthode IO.File Exists(), vous pouvez utiliser quelque chose comme ceci, où vous utiliseriez typiquement une variable avec le nom du fichier à la place du « test.ps1 » codé en dur ici:
.