Windows, PowerShell und lange Pfade

Windows, PowerShell und lange Pfade

Ich denke, Ihnen ist es genauso wie mir gegangen, dass Sie bereits Wege wie diesen gesehen haben. !!! Wichtig____Neu____!!! Bitte nicht löschen!!! Verordnung №98819-649-Б vom 30. Februar 1985 über die Ernennung von Ivan Alexandrovich Kozlov zum vorübergehenden Leiter der Abteilung für die Betreuung von Unternehmens-VIP-Kunden und Organisation von Geschäftstreffen im Hintergrund.doc.

Und oft lässt sich ein solches Dokument unter Windows nicht sofort öffnen. Einige nutzen Umgehungsmethoden wie das Mappen von Laufwerken, andere verwenden Dateimanager, die mit langen Pfaden umgehen können: Far Manager, Total Commander und ähnliche. Viele haben auch betrübt beobachtet, wie ihr PS-Skript, in das viel Arbeit investiert wurde und das in der Testumgebung hervorragend funktionierte, in der Produktionsumgebung hilflos über die unlösbare Aufgabe klagte: Der angegebene Pfad, Dateiname oder beides sind zu lang. Der vollqualifizierte Dateiname muss weniger als 260 Zeichen und der Verzeichnisname weniger als 248 Zeichen betragen.
Wie sich herausstellte, sind 260 Zeichen nicht für „alle“ ausreichend. Wenn Sie daran interessiert sind, die zulässigen Grenzen zu überschreiten – bitte nach dem Cut.

Hier sind nur einige der traurigen Folgen der Begrenzung der Länge von Dateipfaden:

Etwas vom Thema abweichend möchte ich anmerken, dass für DFS-Replikation das in diesem Artikel betrachtete Problem nicht entscheidend ist und Dateien mit langen Namen erfolgreich von Server zu Server reisen (sofern Sie ansonsten alles richtig gemacht haben) haben Sie alles richtig gemacht).

Ich möchte außerdem auf ein sehr nützliches Tool hinweisen, das mir mehrfach geholfen hat robocopy. Auch es fürchtet sich nicht vor langen Pfaden und kann viel. Daher kann man, wenn die Aufgabe darin besteht, Daten zu kopieren/verschieben, sich dafür entscheiden. Wenn es darum geht, mit Zugriffssteuerungslisten im Dateisystem (DACL) zu arbeiten, schauen Sie in Richtung subinacl. Trotz ihres stattlichen Alters hat sie sich unter Windows 2012 R2 hervorragend bewährt. Hier Es wurden Anwendungsmöglichkeiten untersucht.

Ich war allerdings gespannt darauf, PowerShell im Umgang mit langen Pfaden beizubringen. Es ist fast so wie in dem alten Witz über Iwan-Zarewitsch und Wasilissa die Wunderschöne.

Schnelle Methode

Wechseln Sie zu Linux und machen Sie sich keine Gedanken über Windows 10/2016/2019 und aktivieren Sie die entsprechende Gruppenrichtlinieneinstellung oder optimieren Sie die Registrierung. Ich werde nicht ausführlich auf diese Methode eingehen, da es bereits viele Artikel zu diesem Thema im Netz gibt, zum Beispiel, dies.

Angesichts der Tatsache, dass in den meisten Unternehmen viele, milde gesagt, veraltete Versionen von Betriebssystemen vorhanden sind, ist diese Methode nur auf dem Papier schnell, es sei denn, Sie gehören zu den glücklichen Personen, die nur wenige Altsysteme haben und mit Windows 10/2016/2019 arbeiten.

Lange Methode

Hier sei gleich klargestellt, dass die Änderungen das Verhalten des Windows-Explorers nicht beeinträchtigen werden, sondern die Verwendung von langen Pfaden in PowerShell-Cmdlets wie Get-Item, Get-ChildItem, Remove-Item usw. ermöglichen.

Zunächst aktualisieren wir PowerShell. Dies ist im Handumdrehen erledigt.

  1. Wir aktualisieren das .NET Framework auf mindestens Version 4.5. Das Betriebssystem sollte mindestens Windows 7 SP1/2008 R2 sein. Die aktuelle Version kann heruntergeladen werden hier, weitere Informationen können gelesen werden hier.
  2. Wir laden herunter und installieren das Windows Management Framework 5.1
  3. Wir starten den Computer neu.

Fleißige Personen können die oben beschriebenen Schritte manuell durchführen, während die Faulen dies mit Hilfe von SCCM, Richtlinien, Skripten und anderen Automatisierungsmitteln erledigen können.

Die aktuelle Version von PowerShell kann aus der Variable $PSVersionTableabgerufen werden. Nach dem Update sollte es ungefähr so aussehen:

Windows, PowerShell und lange Pfade

Jetzt können Sie beim Verwenden von Cmdlets Get-ChildItem und ähnlichen statt des gewohnten Pfad verwenden LiteralPath.

Das Format der Pfade wird dabei etwas anders sein:

Get-ChildItem -LiteralPath "?C:Folder"
Get-ChildItem -LiteralPath "?UNCServerNameShare"
Get-ChildItem -LiteralPath "?UNC192.168.0.10Share"

Zur besseren Umwandlung von Pfaden aus dem gewohnten Format in das Format LiteralPath kann folgende Funktion verwendet werden:

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"}
}

Bitte beachten Sie, dass beim Festlegen des Parameters LiteralPath Wildcard-Zeichen nicht verwendet werden dürfen (*, ? usw.).

Neben dem Parameter LiteralPath, hat das aktualisierte PowerShell-Cmdlet Get-ChildItem den Parameter Depth, mit dem die Tiefe für die rekursive Suche festgelegt werden kann, den ich ein paar Mal verwendet habe und mit dem ich sehr zufrieden war.

Jetzt müssen Sie keine Angst mehr haben, dass Ihr PS-Skript von seinem langen, steinigen Weg abkommt und die weit entfernten Dateien nicht erkennt. Mich hat dieser Ansatz zum Beispiel sehr unterstützt, als ich ein Skript zum Zurücksetzen des Attributs "vorübergehend" bei Dateien in DFSR-Ordnern schrieb. Aber das ist eine andere Geschichte, über die ich in einem anderen Artikel zu berichten versuchen werde. Ich freue mich auf interessante Kommentare von Ihnen und lade Sie ein, an der Umfrage teilzunehmen.

Nützliche Links:
docs.microsoft.com/ru-ru/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

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte einloggen.

Ist das Problem der langen Pfade für Sie relevant?

  • Ja

  • War relevant, habe es aber bereits gelöst

  • Stört, aber nicht erheblich

  • Habe nicht darüber nachgedacht, scheint alles zu funktionieren

  • Nein

  • Andere (bitte in den Kommentaren angeben)

155 Benutzer haben abgestimmt. 25 Benutzer haben sich enthalten.

Quelle: habr.com

60GB SSD 8Gb DDR4