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-ID: 313559

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

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

Chonta
Chonta 25.08.2016 um 14:47:02 Uhr
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
Bugger
Bugger 25.08.2016 um 15:31:35 Uhr
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
129813
129813 25.08.2016 aktualisiert um 15:45:52 Uhr
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
Chonta
Chonta 25.08.2016 um 15:43:54 Uhr
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
colinardo
colinardo 25.08.2016 aktualisiert um 16:19:23 Uhr
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
agowa338
agowa338 26.08.2016 um 05:16:56 Uhr
Goto Top
Man könnte denen ja nochmal einen Bugreport schreiben...
https://github.com/PowerShell/PowerShell/issues
Bugger
Bugger 26.08.2016 um 10:06:10 Uhr
Goto Top
Danke Uwe, funktioniert echt super - bis auf die Umlaute, die übernimmt er leider noch nicht richtig. Kann man da noch was drehen?
colinardo
Lösung colinardo 26.08.2016 aktualisiert um 10:33:23 Uhr
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  
Bugger
Bugger 26.08.2016 um 10:54:31 Uhr
Goto Top
Super klasse, vielen Dank! Funktioniert perfekt face-smile
Knorkator
Knorkator 26.08.2016 um 12:02:30 Uhr
Goto Top
Auch wenn es schon gelöst wurde..
https://pathlengthchecker.codeplex.com/
Roland567
Roland567 13.03.2017 um 14:39:25 Uhr
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