32 votes

Get-ChildItem et espace insécable

En travaillant sur mes serveurs de fichiers, j'ai remarqué un dossier étrange qui a cassé mon script. Le dossier a un nom composé d'un seul caractère avec la valeur ascii 160 ( espace insécable (NBSP). Visuellement, ce nom est le même que le caractère d'espace.

En bref, j'ai Get-ChildItem est exécuté sur ce dossier et il entre dans une boucle sans fin. La commande est en réalité exécutée contre le dossier parent et elle retourne à nouveau le dossier problématique, donc mon script est entré dans une boucle sans fin.

Vous pouvez facilement simuler cela sur votre propre environnement. Dans C:\temp créer un nouveau dossier dont le nom est uniquement NBSP. Vous pouvez taper ce nom en maintenant la touche alt et en appuyant sur 0160 sur le clavier numérique. Après l'avoir créé, exécutez

Get-ChildItem C:\Temp\ -Recurse

vous obtiendrez une liste interminable de dossiers sans nom, bien que je n'aie que ce seul dossier.

d-----        6/15/2017   2:20 PM
d-----        6/15/2017   2:20 PM
d-----        6/15/2017   2:20 PM
d-----        6/15/2017   2:20 PM
d-----        6/15/2017   2:20 PM
. . .

J'ai testé ceci avec PowerShell 4 et 5, sur le serveur et le système d'exploitation client et c'est le même comportement. Commande Get-Item a également un problème avec ce nom, et les deux commutateurs -Path y -LiteralPath se comportent de la même manière. J'ai également essayé [System.IO.Directory] mais il avait le même problème.

Question : J'ai mis à jour mon script pour signaler les dossiers portant ce nom comme une erreur et les ignorer, mais je me demande s'il existe un moyen plus intelligent de le faire ? Mon objectif serait d'exécuter Get-ChildItem ou équivalent contre ce dossier.

Est-ce un problème connu ? Cela vaudrait-il la peine de le signaler quelque part comme un bogue, s'il est confirmé par d'autres personnes ?

1voto

Sage Pourpre Points 108

Comme mentionné dans le commentaire, vous avez trouvé une erreur réelle qui, espérons-le, sera bientôt corrigée.

Cependant, il existe une solution de rechange très acceptable que vous pouvez appliquer avec un minimum d'effort tout en continuant à utiliser Get-ChildItem sans avoir besoin d'exclure votre dossier.

La version Unicode de Get-ChildItem ne souffre pas de ce problème. (Testé sur Powershell 5.1 dans un environnement Windows 10) Pour l'utiliser, il suffit de remplacer

Get-ChildItem  -Path 'c:\__tmp' -recurse 

par

Get-ChildItem  -LiteralPath '\\?\c:\__tmp' -recurse 

Note supplémentaire

Si vous devez traiter avec UNC, l'appel unicode UNC est légèrement différent.

Get-ChildItem  -LiteralPath '\\?\UNC\127.0.0.1\c$\__tmp' -recurse 

Notez que pour que cela fonctionne correctement, j'ai utilisé l'option -LiteralPath au lieu du paramètre -Path .

Références

Extrait de la documentation Microsoft

-LiteralPath

Spécifie un chemin d'accès à un ou plusieurs emplacements. Contrairement au paramètre -Path, la valeur du paramètre -LiteralPath est utilisée exactement telle qu'elle est tapée. Aucun caractère n'est interprété comme un caractère générique. Si le chemin d'accès comprend des caractères d'échappement, il doit être placé entre guillemets simples. Les guillemets simples indiquent à Windows PowerShell de ne pas interpréter les caractères comme des séquences d'échappement.

source

En ce qui concerne la convention de préfixe unicode : Nommer les fichiers, les chemins et les espaces de noms

Bonus L'appel unicode a également l'avantage de résoudre la limite de 260 caractères pour la longueur du chemin : voir ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X