it-swarm.com.de

Wie finde ich in Windows Dateien mit einer Pfadlänge von mehr als 260 Zeichen?

Ich verwende eine Xcopy in einem XP Windows-Skript, um ein Verzeichnis rekursiv zu kopieren. Ich bekomme immer die Fehlermeldung "Unzureichender Arbeitsspeicher". Ich verstehe, dass eine zu kopierende Datei einen zu langen Pfad hat. Ich kann die Pfadlänge leicht reduzieren, aber leider kann ich nicht herausfinden, welche Dateien gegen die Pfadlängeneinschränkung verstoßen. Die kopierten Dateien werden in der Standardausgabe (die ich in eine Protokolldatei umleite) gedruckt. Die Fehlermeldung wird jedoch auf dem Terminal ausgegeben. Ich kann also nicht genau ermitteln, für welches Verzeichnis der Fehler ausgegeben wird .

69
WestHamster

führen Sie einen dir /s /b > out.txt aus und fügen Sie an Position 260 eine Anleitung hinzu 

In Powershell cmd /c dir /s /b |? {$_.length -gt 260} 

91
rerun

Ich habe das Pfadlängen-Prüfwerkzeug für diesen Zweck erstellt. Hierbei handelt es sich um eine kostenlose GUI-Anwendung von Nice, mit der Sie die Pfadlängen aller Dateien und Verzeichnisse in einem bestimmten Verzeichnis anzeigen können.

Ich habe auch über ein einfaches PowerShell-Skript geschrieben/geschrieben , um Datei- und Verzeichnislängen zu erhalten. Es gibt die Länge und den Pfad einer Datei aus und schreibt sie optional auch in die Konsole. Es ist nicht auf die Anzeige von Dateien beschränkt, die nur eine bestimmte Länge haben (eine einfache Änderung), sondern sie werden nach Länge absteigend angezeigt. Daher ist es sehr einfach zu erkennen, welche Pfade sich über Ihrer Schwelle befinden. Hier ist es:

$pathToScan = "C:\Some Folder"  # The path to scan and the the lengths for (sub-directories will be scanned as well).
$outputFilePath = "C:\temp\PathLengths.txt" # This must be a file in a directory that exists and does not require admin rights to write to.
$writeToConsoleAsWell = $true   # Writing to the console will be much slower.

# Open a new file stream (Nice and fast) and write all the paths and their lengths to it.
$outputFileDirectory = Split-Path $outputFilePath -Parent
if (!(Test-Path $outputFileDirectory)) { New-Item $outputFileDirectory -ItemType Directory }
$stream = New-Object System.IO.StreamWriter($outputFilePath, $false)
Get-ChildItem -Path $pathToScan -Recurse -Force | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}} | Sort-Object -Property FullNameLength -Descending | ForEach-Object {
    $filePath = $_.FullName
    $length = $_.FullNameLength
    $string = "$length : $filePath"

    # Write to the Console.
    if ($writeToConsoleAsWell) { Write-Host $string }

    #Write to the file.
    $stream.WriteLine($string)
}
$stream.Close()
25
deadlydog

Als Verfeinerung der einfachsten Lösung, und wenn Sie Powershell nicht installieren können oder wollen, führen Sie einfach Folgendes aus:

dir /s /b | sort /r /+261 > out.txt

oder (schneller):

dir /s /b | sort /r /+261 /o out.txt

Und Zeilen, die länger als 260 sind, kommen an die Spitze der Liste. Beachten Sie, dass Sie 1 zum Spaltenparameter SORT (/ + n) hinzufügen müssen.

20
Chungalin

Von http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-und-tricks/ :

Get-ChildItem –Force –Recurse –ErrorAction SilentlyContinue –ErrorVariable AccessDenied

der erste Teil durchläuft nur diese und Unterordner. using -ErrorVariable AccessDenied bedeutet Schiebe die störenden Elemente in die Powershell-Variable AccessDenied.

Sie können die Variable dann wie folgt scannen

$AccessDenied |
Where-Object { $_.Exception -match "must be less than 260 characters" } |
ForEach-Object { $_.TargetObject }

Wenn Sie sich nicht für diese Dateien interessieren (kann in einigen Fällen zutreffend sein), löschen Sie einfach den -ErrorVariable AccessDenied-Teil.

2
Jonno

Ich habe eine Alternative zu den anderen guten Antworten hier gemacht, die PowerShell verwenden, aber meine speichert auch die Liste in einer Datei. Werde es hier teilen, falls jemand anderes so etwas will.

Warnung: Code überschreibt "longfilepath.txt" im aktuellen Arbeitsverzeichnis. Ich weiß, es ist unwahrscheinlich, dass Sie bereits eine haben, aber nur für den Fall!

Wollte es in einer einzigen Zeile:

Out-File longfilepath.txt ; cmd /c "dir /b /s /a" | ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}

Detaillierte Anleitung:

  1. Führen Sie PowerShell aus
  2. Navigieren Sie zu dem Verzeichnis, das Sie auf Dateipfadlängen überprüfen möchten (C: Works).
  3. Kopieren Sie den Code und fügen Sie ihn ein [Klicken Sie mit der rechten Maustaste, um ihn in PowerShell einzufügen, oder drücken Sie Alt + Leertaste> E> P].
  4. Warten Sie, bis es fertig ist, und zeigen Sie die Datei an: cat longfilepath.txt | sort

Erklärung:

Out-File longfilepath.txt ; - Eine leere Datei mit dem Titel 'longfilepath.txt' erstellen (oder überschreiben). Semikolon, um Befehle zu trennen.

cmd /c "dir /b /s /a" | - Führen Sie den Befehl dir auf PowerShell aus, /a, um alle Dateien einschließlich versteckter Dateien anzuzeigen. | zur Pipe.

ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} - Fügt die Zeile für jede Zeile (als $ _ bezeichnet) an die Datei an, wenn die Länge größer als 250 ist.

2
Rani Kheir

sie können stderr umleiten.

mehr Erklärung hier , aber mit einem Befehl wie:

MyCommand >log.txt 2>errors.txt

sollte die Daten, die Sie suchen, ergreifen.

Als Trick umgeht Windows diese Einschränkung, wenn dem Pfad \\?\ ( msdn ) vorangestellt wird.

Ein weiterer Trick, wenn Sie einen Stamm oder ein Ziel haben, das mit einem langen Pfad beginnt. Vielleicht hilft SUBST:

SUBST Q: "C:\Documents and Settings\MyLoginName\My Documents\MyStuffToBeCopied"
Xcopy Q:\ "d:\Where it needs to go" /s /e
SUBST Q: /D
2
SeanC

TLPD ("zu langes Pfadverzeichnis") ist das Programm, das mich gespeichert hat.

https://sourceforge.net/projects/tlpd/

0
pollaris