Windows, PowerShell und lange Pfade

Windows, PowerShell und lange Pfade

Ich glaube, Sie haben, wie ich, solche Wege schon mehr als einmal gesehen !!! Wichtig____Neu____!!! Nicht löschen!!! Bestell-Nr. 98819-649-B vom 30. Februar 1985 über die Ernennung von Ivan Aleksandrovich Kozlov zum kommissarischen Leiter der Abteilung für die Betreuung von VIP-Firmenkunden und die Organisation von Geschäftstreffen am Spielfeldrand.doc.

Und oft gelingt es Ihnen nicht, ein solches Dokument sofort in Windows zu öffnen. Manche praktizieren Workarounds in Form von Festplattenzuordnung, andere nutzen Dateimanager, die mit langen Pfaden arbeiten können: Far Manager, Total Commander und dergleichen. Und viele weitere sahen mit Trauer zu, wie das von ihnen erstellte PS-Skript, in das viel Arbeit investiert wurde und das in der Testumgebung mit Bravour funktionierte, in einer Produktionsumgebung hilflos über eine unmögliche Aufgabe klagte: Der angegebene Pfad, Dateiname oder beide sind zu lang. Der vollständig qualifizierte Dateiname muss weniger als 260 Zeichen lang sein und der Verzeichnisname muss weniger als 248 Zeichen lang sein.
Wie sich herausstellt, reichen 260 Zeichen „nicht nur für alle“. Wenn Sie daran interessiert sind, über die Grenzen des Erlaubten hinauszugehen, wenden Sie sich bitte an die Katze.

Hier sind nur einige der unglücklichen Folgen einer Begrenzung der Dateipfadlänge:

Etwas vom Thema abweichend stelle ich fest, dass das im Artikel besprochene Problem für die DFS-Replikation nicht schlimm ist und Dateien mit langen Namen erfolgreich von Server zu Server übertragen werden (sofern natürlich alles andere zutrifft). richtig gemacht).

Ich möchte Sie auch auf ein sehr nützliches Dienstprogramm aufmerksam machen, das mir mehr als einmal geholfen hat robocopy. Sie hat auch keine Angst vor langen Wegen und kann viel. Wenn sich die Aufgabe also auf das Kopieren/Übertragen von Dateidaten beschränkt, können Sie hier aufhören. Wenn Sie mit Dateisystem-Zugriffskontrolllisten (DACLs) tricksen müssen, schauen Sie weg subinakl. Trotz seines fortgeschrittenen Alters schnitt es unter Windows 2012 R2 hervorragend ab. Hier Anwendungsmethoden werden berücksichtigt.

Ich war daran interessiert, zu lehren, wie man mit langen PowerShell-Pfaden arbeitet. Bei ihm ist es fast wie in einem bärtigen Witz über Iwan Zarewitsch und Wassilisa die Schöne.

Schneller Weg

Wechseln Sie zu Linux und machen Sie sich keine Sorgen um Windows 10/2016/2019 und aktivieren Sie die entsprechende Gruppenrichtlinieneinstellung/optimieren Sie die Registrierung. Ich werde nicht näher auf diese Methode eingehen, weil... Im Internet gibt es bereits viele Artikel zu diesem Thema, z.B. diese.

Wenn man bedenkt, dass die meisten Unternehmen viele, gelinde gesagt, nicht die neuesten Versionen von Betriebssystemen haben, ist diese Methode nur zum Schreiben auf Papier schnell, es sei denn natürlich, Sie gehören zu den Glücklichen, die nur wenige Legacy-Systeme und Windows 10 haben /2016/2019 steht an oberster Stelle.

Der lange Weg

Bedenken wir hier gleich, dass sich die Änderungen nicht auf das Verhalten des Windows Explorers auswirken, sondern die Verwendung langer Pfade in PowerShell-Cmdlets wie Get-Item, Get-ChildItem, Remove-Item usw. ermöglichen.

Lassen Sie uns zunächst PowerShell aktualisieren. Es wird ein-, zwei-, dreimal gemacht.

  1. Wir aktualisieren das .NET Framework auf Version mindestens 4.5. Das Betriebssystem muss mindestens Windows 7 SP1/2008 R2 sein. Sie können die aktuelle Version herunterladen hier, lesen Sie weitere Informationen hier.
  2. Herunterladen und installieren Sie Windows Management Framework 5.1
  3. Wir starten die Maschine neu.

Fleißige Menschen können die oben beschriebenen Schritte manuell ausführen, faule Menschen können dies mithilfe von SCCM, Richtlinien, Skripten und anderen Automatisierungstools tun.

Die aktuelle Version von PowerShell kann der Variablen entnommen werden $ PSVersionTable. Nach dem Update sollte es etwa so aussehen:

Windows, PowerShell und lange Pfade

Jetzt bei der Verwendung von Cmdlets Get-ChildItem und dergleichen statt des Üblichen Path удем использовать literalPfad.

Das Pfadformat wird etwas anders sein:

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

Zur Vereinfachung der Pfadkonvertierung vom üblichen Format in das Format literalPfad Sie können diese Funktion verwenden:

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 dies bei der Einstellung des Parameters literalPfad Sie können keine Platzhalter verwenden (*, ? usw.).

Zusätzlich zum Parameter literalPfad, in der aktualisierten Version des PowerShell-Cmdlets Get-ChildItem Habe den Parameter erhalten Tiefe, mit dem man die Verschachtelungstiefe für die rekursive Suche festlegen kann, habe ich ein paar Mal verwendet und war zufrieden.

Jetzt müssen Sie sich keine Sorgen mehr machen, dass Ihr PS-Skript auf dem langen, dornigen Weg vom Weg abkommt und entfernte Dateien nicht mehr sehen kann. Dieser Ansatz hat mir beispielsweise beim Schreiben eines Skripts zum Zurücksetzen des „temporären“ Attributs von Dateien in DFSR-Ordnern sehr geholfen. Aber das ist eine andere Geschichte, die ich in einem anderen Artikel zu erzählen versuche. Ich freue mich über interessante Kommentare von Ihnen und empfehle Ihnen, 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

An der Umfrage können nur registrierte Benutzer teilnehmen. Einloggenbitte.

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

  • Ja

  • War relevant, aber bereits entschieden

  • Es stört, aber nicht viel

  • Ich habe nicht darüber nachgedacht, alles scheint zu funktionieren

  • Nein

  • Sonstiges (bitte in den Kommentaren angeben)

155 Benutzer haben abgestimmt. 25 Benutzer enthielten sich der Stimme.

Source: habr.com

Kommentar hinzufügen