Windows PowerShell et longs chemins



Je pense que vous, comme moi, avez souvent vu des chemins de la forme \ !!! Important \ ____ Nouveau ____ \ !!! Ne pas supprimer !!! \ Commande n ° 98819-649-B du 30 février 1985 sur la nomination de Kozlov Ivan Aleksandrovich au poste de chef par intérim du département chargé d'accompagner les clients VIP d'entreprise et d'organiser des réunions d'affaires en marge.doc .

Et souvent, ouvrir un tel document sous Windows ne fonctionne pas tout de suite. Quelqu'un pratique la solution de contournement sous forme de mappage de disque, quelqu'un utilise des gestionnaires de fichiers qui peuvent travailler avec de longs chemins: Far Manager, Total Commander et autres. Et beaucoup d'autres ont malheureusement regardé la création d'un script PS, ce qui représentait beaucoup de travail et fonctionnait dans un environnement de test avec fracas, dans un environnement de combat, se plaignant impuissant d'une tâche impossible: le chemin spécifié, le nom de fichier ou les deux sont trop longs . Le nom de fichier complet doit contenir moins de 260 caractères et le nom du répertoire doit contenir moins de 248 caractères.
Il s'est avéré que 260 caractères suffisaient "non seulement pour tout le monde". Si vous êtes intéressé à aller au-delà des limites de ce qui est autorisé - je demande chat.

Voici quelques-unes des tristes conséquences de limiter la longueur d'un chemin de fichier:


Un peu différent du sujet, je note que pour la réplication DFS, le problème considéré dans l'article n'est pas terrible et les fichiers avec des noms longs voyagent avec succès de serveur en serveur (à moins, bien sûr, que vous ayez tout fait correctement le reste).

Je voudrais également attirer l'attention sur l'utilitaire très utile de photocopie qui m'a aidé plus d'une fois. Elle aussi n'a pas peur des longs chemins et elle en sait beaucoup. Par conséquent, si la tâche se résume à copier / transférer des données de fichier, vous pouvez vous y arrêter. Si vous avez besoin de chamaniser avec des listes de contrôle d'accès au système de fichiers (DACL), regardez vers subinacl . Malgré son âge considérable, il a montré d'excellents résultats sur Windows 2012 R2. Les méthodes d'application sont discutées ici.

C'était intéressant pour moi d'enseigner à travailler avec PowerShell de manière longue. Avec lui presque comme dans une anecdote barbue sur Ivan Tsarévitch et Vasilisa la Belle.

Moyen rapide


Accédez à Linux et ne faites pas fonctionner Windows 10/2016/2019 et activez le paramètre de stratégie de groupe correspondant / cliquez sur le registre. Je ne m'attarderai pas sur cette méthode en détail, car il y a déjà beaucoup d'articles sur le réseau sur ce sujet, par exemple celui-ci .

Étant donné que dans la plupart des entreprises, il existe de nombreuses versions de systèmes d'exploitation, ce n'est pas une nouvelle version des systèmes d'exploitation, cette méthode n'est rapide que pour l'écriture sur papier, à moins, bien sûr, que vous ne soyez de ceux qui ont peu de systèmes hérités et règnent Windows 10/2016/2019 .

Long chemin


Ici, nous réservons immédiatement que les modifications n'affecteront pas le comportement de l'Explorateur Windows, mais permettront d'utiliser de longs chemins dans les applets de commande PowerShell, telles que Get-Item, Get-ChildItem, Remove-Item, etc.

Tout d'abord, mettez à niveau PowerShell. C'est fait un-deux-trois.

  1. Nous mettons à jour le .NET Framework vers une version non inférieure à 4.5. Le système d'exploitation doit être au moins Windows 7 SP1 / 2008 R2. La version actuelle peut être téléchargée ici , lisez plus d'informations ici .
  2. Téléchargez et installez Windows Management Framework 5.1
  3. Redémarrez la voiture.

Les personnes assidues peuvent effectuer manuellement les étapes décrites ci-dessus, paresseuses - à l'aide de SCCM, de politiques, de scripts et d' enikys d' autres outils d'automatisation.

La version actuelle de PowerShell se trouve dans la variable $ PSVersionTable . Après la mise à jour, cela devrait ressembler à ceci:



Maintenant, lorsque vous utilisez les applets de commande Get-ChildItem et similaires, au lieu du chemin habituel , nous utiliserons LiteralPath .

Le format des chemins sera légèrement différent:

Get-ChildItem -LiteralPath "\\?\C:\Folder" Get-ChildItem -LiteralPath "\\?\UNC\ServerName\Share" Get-ChildItem -LiteralPath "\\?\UNC\192.168.0.10\Share" 

Pour faciliter la conversion de chemins du format familier au format LiteralPath , vous pouvez utiliser cette fonction:

 Function ConvertTo-LiteralPath { Param([parameter(Mandatory=$true, Position=0)][String]$Path) If ($Path.Substring(0,2) -eq "\\") {Return ("\\?\UNC" + $Path.Remove(0,1))} Else {Return "\\?\$Path"} } 

Veuillez noter que vous ne pouvez pas utiliser de caractères génériques ( * , ? , Etc.) lors de la spécification du paramètre LiteralPath .

En plus du paramètre LiteralPath , dans la version mise à jour de PowerShell, l'applet de commande Get-ChildItem a reçu le paramètre Depth , avec lequel vous pouvez définir la profondeur d'imbrication pour une recherche récursive, je l'ai utilisé plusieurs fois et j'étais satisfait.

Maintenant, vous ne pouvez pas avoir peur que votre script PS s'égare et ne distingue pas les fichiers distants. Par exemple, cette approche m'a beaucoup aidé lors de l'écriture d'un script pour supprimer l'attribut «temporaire» sur les fichiers des dossiers DFSR. Mais c'est une autre histoire, que j'essaierai de raconter dans un autre article.
UPD 07/06/2019: article promis
J'attends vos commentaires intéressants et je vous suggère de répondre à une enquête.

Liens utiles:
docs.microsoft.com/en-us/dotnet/api/microsoft.powershell.commands.contentcommandbase.literalpath?view=powershellsdk-1.1.0
docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-5.1
stackoverflow.com/questions/46308030/handling-path-too-long-exception-with-new-psdrive/46309524
luisabreu.wordpress.com/2013/02/15/theliteralpath-parameter

Source: https://habr.com/ru/post/fr457204/


All Articles