
Ich denke, dass Sie, wie ich, oft Wege der Form gesehen haben
\ !!! Wichtig \ ____ Neu ____ \ !!! Nicht löschen !!! \ Bestellnummer 98819-649-B vom 30. Februar 1985 über die Ernennung von Kozlov Ivan Aleksandrovich zum Interimsleiter der Abteilung für die Begleitung von VIP-Firmenkunden und die Organisation von Geschäftstreffen am Rande .
Und oft funktioniert das Öffnen eines solchen Dokuments in Windows nicht sofort. Jemand übt eine Problemumgehung in Form von Festplattenzuordnung, jemand verwendet Dateimanager, die mit langen Pfaden arbeiten können: Far Manager, Total Commander und dergleichen. Und viele weitere sahen traurig zu, wie sie ein PS-Skript erstellten, das viel Arbeit war und in einer Testumgebung mit einem Knall funktionierte. In einer Kampfumgebung beklagten sie sich hilflos über eine unmögliche Aufgabe:
Der angegebene Pfad, der Dateiname oder beide sind zu lang . Der vollständig qualifizierte Dateiname muss weniger als 260 Zeichen und der Verzeichnisname weniger als 248 Zeichen enthalten.Wie sich herausstellte, reichen 260 Zeichen "nicht nur für alle". Wenn Sie daran interessiert sind, die Grenzen des Zulässigen zu überschreiten, bitte ich Sie um Katze.
Hier sind nur einige der traurigen Folgen der Begrenzung der Länge eines Dateipfads:
Etwas abweichend vom Thema stelle ich fest, dass für die DFS-Replikation das in diesem Artikel behandelte Problem nicht schrecklich ist und Dateien mit langen Namen erfolgreich von Server zu Server übertragen werden (es sei denn, Sie
haben den Rest natürlich
korrekt ausgeführt ).
Ich möchte auch auf das sehr nützliche
Robocopy- Dienstprogramm aufmerksam machen
, das mir mehr als einmal geholfen hat. Auch sie hat keine Angst vor langen Wegen und weiß viel. Wenn es bei der Aufgabe darum geht, Dateidaten zu kopieren / übertragen, können Sie damit aufhören. Wenn Sie mit Dateisystem-Zugriffssteuerungslisten (DACLs) schamanisieren müssen, schauen Sie in Richtung
subinacl . Trotz seines beträchtlichen Alters zeigte es unter Windows 2012 R2 hervorragende Ergebnisse. Anwendungsmethoden werden hier diskutiert.
Es war für mich interessant zu lehren, wie man mit PowerShell auf langen Wegen arbeitet. Mit ihm fast wie in einer bärtigen Anekdote über Iwan Zarewitsch und Vasilisa die Schöne.
Schneller Weg
Gehen Sie zu
Linux und dämpfen Sie Windows 10/2016/2019 nicht und aktivieren Sie die entsprechende Gruppenrichtlinieneinstellung / klicken Sie auf Registrierung. Ich werde nicht im Detail auf diese Methode eingehen, weil Zu diesem Thema gibt es im Netzwerk bereits viele Artikel, zum Beispiel
diesen .
Angesichts der Tatsache, dass es in den meisten Unternehmen, gelinde gesagt, viele neue Versionen von Betriebssystemen gibt, ist diese Methode nur zum Schreiben auf Papier schnell, es sei denn, Sie gehören zu den Glücklichen, die nur wenige Legacy-Systeme haben und Windows 10/2016/2019 regieren .
Langer Weg
Hier reservieren wir sofort, dass die Änderungen das Verhalten von Windows Explorer nicht beeinflussen, aber die Verwendung langer Pfade in PowerShell-Cmdlets wie Get-Item, Get-ChildItem, Remove-Item usw. ermöglichen.
Aktualisieren Sie zunächst PowerShell. Es ist eins, zwei, drei.
- Wir aktualisieren .NET Framework auf eine Version, die nicht niedriger als 4.5 ist. Das Betriebssystem muss mindestens Windows 7 SP1 / 2008 R2 sein. Die aktuelle Version kann hier heruntergeladen werden . Weitere Informationen finden Sie hier .
- Laden Sie Windows Management Framework 5.1 herunter und installieren Sie es
- Starten Sie das Auto neu.
Fleißige Leute können die oben beschriebenen Schritte manuell
ausführen , faul - mithilfe von SCCM, Richtlinien, Skripten und
Enikeys anderer Automatisierungstools.
Die aktuelle Version von PowerShell finden Sie in der Variablen
$ PSVersionTable . Nach dem Update sollte es ungefähr so aussehen:

Wenn
Sie jetzt die Cmdlets
Get-ChildItem und dergleichen anstelle des üblichen
Pfads verwenden, verwenden wir
LiteralPath .
Das Format der Pfade unterscheidet sich geringfügig:
Get-ChildItem -LiteralPath "\\?\C:\Folder" Get-ChildItem -LiteralPath "\\?\UNC\ServerName\Share" Get-ChildItem -LiteralPath "\\?\UNC\192.168.0.10\Share"
Mit dieser Funktion können
Sie Pfade vom bekannten Format in das
LiteralPath- Format konvertieren:
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 Sie bei der Angabe des
LiteralPath- Parameters keine Platzhalter (
* ,
? , Etc.) verwenden
können .
Zusätzlich zum
LiteralPath- Parameter hat das
Cmdlet Get-ChildItem in der aktualisierten Version von PowerShell den Parameter
Depth erhalten , mit dem Sie die Verschachtelungstiefe für eine rekursive Suche festlegen können. Ich habe ihn einige Male verwendet und war zufrieden.
Jetzt können Sie keine Angst mehr haben, dass Ihr PS-Skript in die Irre geht und keine entfernten Dateien erkennt. Dieser Ansatz hat mir beispielsweise beim Schreiben eines Skripts zum Löschen des Attributs "temporär" für Dateien in DFSR-Ordnern sehr geholfen. Aber dies ist eine andere Geschichte, die ich in einem anderen Artikel zu erzählen versuchen werde.
UPD 07/06/2019: Versprochener ArtikelIch warte auf interessante Kommentare von Ihnen und schlage vor, dass Sie an einer Umfrage teilnehmen.
Nützliche Links:docs.microsoft.com/en-us/dotnet/api/microsoft.powershell.commands.contentcommandbase.literalpath?view=powershellsdk-1.1.0docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-5.1stackoverflow.com/questions/46308030/handling-path-too-long-exception-with-new-psdrive/46309524luisabreu.wordpress.com/2013/02/15/theliteralpath-parameter