oliver12
Goto Top

Powershell - Pfade und Dateien vergleichen nicht möglich da Pfad oder Dateiname zu lang

Moin,

ich bin dabei einen File-Server zu replizieren bzw. auf einen neuen zu wechseln. Um zu überprüfen ob beide Orte (alter File-Server, neuer File-Server) gleich sind habe ich schon Einiges (u. a. siehe unten) ausprobiert.

Leider scheitert es an der ersten Hürde. Mehr als 260 Zeichen für Dateien oder 248 Zeichen für Pfade können nicht angezeigt werden. Die Struktur ist einfach sehr groß bzw. tief.

Get-ChildItem -Path 'F:\unterordner\*' -recurse -force | foreach-object -process { $_.FullName.Remove(0,15) }  | Out-File C:\output-file.txt  

Ich bin für jeden guten Tipp sehr dankbar!

Content-ID: 322599

Url: https://administrator.de/forum/powershell-pfade-und-dateien-vergleichen-nicht-moeglich-da-pfad-oder-dateiname-zu-lang-322599.html

Ausgedruckt am: 22.12.2024 um 09:12 Uhr

131381
Lösung 131381 01.12.2016 aktualisiert um 14:12:27 Uhr
Goto Top
Die Struktur ist einfach sehr groß bzw. tief.
Bug der Powershell schon seit Jahren ... MS ändert nichts dran.

Da gibt es nur Workarounds mit dem Auflisten der Dateien mit einem Umweg über robocopy.

(robocopy ''F:\unterordner" "$env:Temp\empty" /E /ZB /L /NS /NC /NJH /NJS /NDL /r:0 /w:0) -replace '^\s+|\s+$','' | select -Skip 1 | %{$_.Substring(15)}  
Um zu überprüfen ob beide Orte (alter File-Server, neuer File-Server) gleich sind habe ich schon Einiges (u. a. siehe unten) ausprobiert.
Warum nutzt du dann nicht direkt Robocopy?!

Gruß
oliver12
oliver12 01.12.2016 aktualisiert um 14:59:52 Uhr
Goto Top
Weil ich das erste mal repliziere und nur für mein Gewissen zu 100 % sicher gehen möchte, dass auch alles dort ist. Schließlich soll in naher Zukunft an einem weiteren Standort ein Server stehen der sich permanent replizieren soll. Dafür ist die Windows-Funktion ja auch nicht schlecht und dafür da.

Zu deinem Befehl habe ich noch eine Frage zum Verständnis. Was bedeutet "$env:Temp\empty" sowie '^\s+|\s+$','' | select -Skip 1?

Und kennst du zufällig die Syntax, wenn ich die ersten "9" Zeichen entfernt haben möchte, so wie ob in meinem PS-Befehl?

Vielen Dank vorab.
131381
131381 01.12.2016 aktualisiert um 15:05:56 Uhr
Goto Top
Zitat von @oliver12:
Zu deinem Befehl habe ich noch eine Frage zum Verständnis. Was bedeutet "$env:Temp\empty"
Das ist ein leerer Dummy-Ordner den es nicht gibt aber für einen Vergleich von Robocopy benötigt wird, denn es wird hier ja nur ein Testlauf (/L) gemacht um an alle Dateinamen zu kommen.
sowie '^\s+|\s+$','' | select -Skip 1?
Das entfernt per Regex Leereichen vor und hinter dem Dateinamen in der Ausgabe von Robocopy und überspringt die erste immer leere Zeile.
Und kennst du zufällig die Syntax, wenn ich die ersten "9" Zeichen entfernt haben möchte, so wie ob in meinem PS-Befehl?
s.o.
oliver12
oliver12 01.12.2016 um 15:24:44 Uhr
Goto Top
Okay, beim letzten habe ich die zweite Zeile im Befehl überlesen.

Eine Frage wäre da noch. Was bedeutet -replace in diesem Zusammenhang? Überschreibt der Befehl?
131381
Lösung 131381 01.12.2016 aktualisiert um 15:29:03 Uhr
Goto Top
Zitat von @oliver12:
Eine Frage wäre da noch. Was bedeutet -replace in diesem Zusammenhang? Überschreibt der Befehl?
Nein. Nochmal ich habe doch geschrieben das der Befehl mit Robocopy nur einen Testlauf macht nur zu dem Zweck um an die Dateipfade zu kommen und diese Ausgabe ist ja ein Array aus Strings bei denen die führenden und nachlaufenden Leerzeichen entfernt werden müssen damit sich cleane Dateinamen ergeben mit denen man arbeiten kann!
oliver12
oliver12 02.12.2016 um 08:26:36 Uhr
Goto Top
Das war unglücklich ausgedrückt. Wenn ich den Befehl ohne /L ausführen würde, wofür steht -replace? Ich habe hierzu nichts finden können.

Vielen Dank jedenfalls für deine Hilfe!
131381
131381 02.12.2016 um 08:52:56 Uhr
Goto Top
Zitat von @oliver12:

Das war unglücklich ausgedrückt. Wenn ich den Befehl ohne /L ausführen würde,
Dann würde Robocopy direkt in den leeren Ordner synchronisieren!

wofür steht -replace? Ich habe hierzu nichts finden können.
Oh man du bist echt schwer von Begriff. Zim dritten mal : -replace ist ein Powershell-Operator der per Regular Expressions die Stdout Ausgabe von Robocopy so clean macht das man den Output vernünftig nutzen kann!!!!!!. Was ist daran so schwer zu verstehen?
lass einfach mal folgende Zeile in der Powershell laufen, dann siehst du das die Pfade Wild in der Mitte stehen:
robocopy ''F:\unterordner" "$env:Temp\empty" /E /ZB /L /NS /NC /NJH /NJS /NDL /r:0 /w:0  
oliver12
oliver12 02.12.2016 um 09:50:11 Uhr
Goto Top
So eine Antwort ohne Emotionen hätte auch gereicht! Schönen Tag noch.

Zitat von @131381:
-replace ist ein Powershell-Operator der per Regular Expressions die Stdout Ausgabe von Robocopy so clean macht das man den Output vernünftig nutzen kann!!!!!!
131381
131381 02.12.2016 um 10:06:03 Uhr
Goto Top
Zitat von @oliver12:
So eine Antwort ohne Emotionen hätte auch gereicht! Schönen Tag noch.
Naja, wenn man das bereits geschriebene und erläuterte x mal wiederholen muss ist irgendwann Schluss mit Lustig.
Eine simple Suche hätte es dir auch verraten
https://www.safaribooksonline.com/library/view/windows-powershell-cookbo ...