bugger
Goto Top

Powershell - Pfadlänge mit mehr als 260 Zeichen

Hallo zusammen,

ich habe bei Frankys Web diesen Code gefunden:

#Zu prüfendes Verzeichnis oder Volume:
$Verzeichnis = "D:\Freigaben"  

#Pfad zur CSV-Datei für den Export:
$CSV = "d:\export.csv"  
     
#Warnstufe für Pfade über XX Zeichen Laenge in CSV schreiben
$Warninglevel = "250"  

#———————————————–
"Pfad;Laenge" | set-content "$CSV"  
$dirlist = Get-ChildItem "$Verzeichnis" -recurse | foreach {$_.Fullname}  
    foreach ($dir in $dirlist)
    {
      $a = $dir | Measure-Object  -Character
      $length = $a.characters

       if ($length -gt $Warninglevel)
       {
        "$dir;$length" | add-content "$CSV"  
       }
    }
$sort = import-csv "$CSV"  -delimiter ";" | Sort-Object -Property Laenge -Descending  
    "" | set-content "$CSV"  
$sort | export-csv "$CSV" -delimiter ";" –NoTypeInformation  

Leider werden Pfade die länger als 260 Zeichen sind nur mit einer Fehlermeldung im log dargestellt aber nicht in der .csv. Außerdem werden Umlaute auch nicht richtig übernommen und mitten im Pfad gibt es dann "?" Kann man da was machen?

Content-Key: 313559

Url: https://administrator.de/contentid/313559

Printed on: April 25, 2024 at 16:04 o'clock

Member: Chonta
Chonta Aug 25, 2016 at 12:47:02 (UTC)
Goto Top
Hallo,

jap das mit den 260 Zeichen ist ein ..... Problem.
Es gibt ein workarround public cmd-let was einer geschrieben hatte das das etwas umgeht und anstelle Get-Chulditem robocopy zum ermitteln der Pfade verwendet.
Oder Du schreibst dein eigenes Script um und Verwendest robocopy
robocopy <Quelle> NULL /L /S /NJH /NFL /NJS /NP /FP /NC /NS /XJ /R:0 /W:0
das sind dan die nutwendigen Schalter für robocopy.

Gruß

Chonta
Member: Bugger
Bugger Aug 25, 2016 at 13:31:35 (UTC)
Goto Top
Also mit dem Befehl listet er dann aber alles auf und nicht nur das mit zuvielen Zeichen. Länger brauchen tut er auch face-sad
Mitglied: 129813
129813 Aug 25, 2016 updated at 13:45:52 (UTC)
Goto Top
Get-ChildItem "$Verzeichnis" -recurse
This is the main problem.
Long paths are a mess in powershell. The Bug lies in the NET-Framework. MS doesn't fix the most important things anymore, since years!! You can see it in Windows 10, buggy just up to the ceiling.

Regards
Member: Chonta
Chonta Aug 25, 2016 at 13:43:54 (UTC)
Goto Top
Der listet alles auf, ja Du musst dann halt noch richtig mit -match filtrn arbeiten, jeh nachdem was Du suchst.
Oder du verwendest das vorgefertigtie cmdlet was einer schon geschrieben und hochgeladen hat, (google)

robocopy erstellt natürlich erstmal eine gesamtliste, die Schalter im Beispiel sind so gesetzt, das ab der Quelle alles recursiv durchgegangen wird, aber nur Dateien angezeigt werden.
Ist nicht ganz so trivial das ganze, bis MS endlich auf den Trichter kommt und die uralt 260 Zeichen Blockade aufhebt.
Aber hey Outlook 2016 kann keine UTF8 Passwörter im Jahr 2016 face-big-smile

Gruß

Chonta
Member: colinardo
colinardo Aug 25, 2016 updated at 14:19:23 (UTC)
Goto Top
$folder = 'D:\Freigaben'  
$export = 'D:\export.csv'   
$warning = 260

$files = (robocopy $folder "$env:Temp\dummy" /E /ZB /L /NS /NC /NJH /NJS /NDL /r:0 /w:0) -replace '^\s+|\s+$','' | select -Skip 1  
$files | ?{$_.length -ge $warning} | select @{n="Path";e={$_}},@{n="Length";e={$_.length}} | sort length -Desc |  export-csv $export -delimiter ";" -NoType -Encoding UTF8  
Grüße Uwe
Member: agowa338
agowa338 Aug 26, 2016 at 03:16:56 (UTC)
Goto Top
Man könnte denen ja nochmal einen Bugreport schreiben...
https://github.com/PowerShell/PowerShell/issues
Member: Bugger
Bugger Aug 26, 2016 at 08:06:10 (UTC)
Goto Top
Danke Uwe, funktioniert echt super - bis auf die Umlaute, die übernimmt er leider noch nicht richtig. Kann man da noch was drehen?
Member: colinardo
Solution colinardo Aug 26, 2016 updated at 08:33:23 (UTC)
Goto Top
Zitat von @Bugger:

Danke Uwe, funktioniert echt super - bis auf die Umlaute, die übernimmt er leider noch nicht richtig. Kann man da noch was drehen?
Kann man
$folder = 'D:\Freigaben'  
$export = 'D:\export.csv'   
$warning = 260

function ConvertFrom-CP850([string[]]$string){
    $cp850 = [System.Text.Encoding]::GetEncoding(850)
    $string | %{$cp850.GetString([System.Console]::OutputEncoding.GetBytes($_))}
}

$files = ConvertFrom-CP850 ((robocopy $folder "$env:Temp\dummy" /E /ZB /L /NS /NC /NJH /NJS /NDL /r:0 /w:0) -replace '^\s+|\s+$','' | select -Skip 1)  
$files | ?{$_.length -ge $warning} | select @{n="Path";e={$_}},@{n="Length";e={$_.length}} | sort length -Desc |  export-csv $export -delimiter ";" -NoType -Encoding UTF8  
Member: Bugger
Bugger Aug 26, 2016 at 08:54:31 (UTC)
Goto Top
Super klasse, vielen Dank! Funktioniert perfekt face-smile
Member: Knorkator
Knorkator Aug 26, 2016 at 10:02:30 (UTC)
Goto Top
Auch wenn es schon gelöst wurde..
https://pathlengthchecker.codeplex.com/
Member: Roland567
Roland567 Mar 13, 2017 at 13:39:25 (UTC)
Goto Top
Hallo
Mit dem TreeSize Pro kann man ganz einfach, mit einem Hacken, die zu langen Pfade rot darstellen und findet somit ganz einfach die zu langen Pfade.
Nach einer Korrektur einfach schnell den Pfad neu scannen und man weiss sofort, ob es gereicht hat.

Gruss Roland