Ich verwende eine xcopy in einem XP-Windows-Skript, um ein Verzeichnis rekursiv zu kopieren. Ich erhalte immer wieder den Fehler "Unzureichender Speicher". Ich verstehe, dass eine Datei, die ich kopieren möchte, einen zu langen Pfad hat. Ich kann die Pfadlänge leicht reduzieren, aber leider kann ich nicht herausfinden, welche Dateien gegen die Pfadlängenbeschränkung verstoßen. Die kopierten Dateien werden in die Standardausgabe gedruckt (die ich in eine Protokolldatei umleitung), aber die Fehlermeldung wird auf dem Terminal gedruckt, sodass ich nicht einmal ungefähr herausfinden kann, für welches Verzeichnis der Fehler angegeben wird .
windows
windows-xp
xcopy
max-path
WestHamster
quelle
quelle
Antworten:
Machen Sie eine
dir /s /b > out.txt
und fügen Sie dann eine Führung an Position 260 hinzuIn Powershell
cmd /c dir /s /b |? {$_.length -gt 260}
quelle
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
wird nur ein verkürzter Pfad gedruckt. zB :D:\Dropbox\ProY...sh._setbinddata
. Das sind genau die Wege, die ich finden möchte, aber ich kann nicht den ganzen Weg sehen! Wie kann man das umgehen?Get-ChildItems -r *
die Datei nicht mehr angezeigt ...dir /s /b
funktioniert nur für mich.Zu diesem Zweck habe ich das Tool zur Überprüfung der Pfadlänge erstellt. Dies ist eine nette, kostenlose GUI-App, 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 zum Abrufen von Datei- und Verzeichnislängen geschrieben und gebloggt . Es gibt die Länge und den Pfad zu einer Datei aus und schreibt sie optional auch in die Konsole. Es beschränkt sich nicht nur auf die Anzeige von Dateien, die nur eine bestimmte Länge haben (eine einfache Änderung), sondern zeigt sie nach Länge absteigend an, sodass Sie immer noch sehr einfach erkennen können, welche Pfade über Ihrem Schwellenwert liegen. Hier ist es:
quelle
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
Als Verfeinerung der einfachsten Lösung und wenn Sie Powershell nicht installieren können oder wollen, führen Sie einfach Folgendes aus:
oder (schneller):
Und Zeilen, die länger als 260 sind, werden an die Spitze der Liste gesetzt. Beachten Sie, dass Sie dem Spaltenparameter SORT (/ + n) 1 hinzufügen müssen.
quelle
Ich habe hier eine Alternative zu den anderen guten Antworten gemacht, die PowerShell verwenden, aber meine speichert die Liste auch in einer Datei. Ich werde es hier teilen, falls jemand anderes so etwas möchte.
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 absichtlich in einer einzigen Zeile:
Detaillierte Anleitung:
cat longfilepath.txt | sort
Erläuterung:
Out-File longfilepath.txt ;
- Erstellen (oder überschreiben) Sie eine leere Datei mit dem Titel 'longfilepath.txt'. Semikolon zum Trennen von Befehlen.cmd /c "dir /b /s /a" |
- Führen Sie den Befehl dir in PowerShell aus,/a
um alle Dateien einschließlich versteckter Dateien anzuzeigen.|
zu pfeifen.ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
- Wenn die Länge für jede Zeile (mit $ _ bezeichnet) größer als 250 ist, hängen Sie diese Zeile an die Datei an.quelle
Sie können stderr umleiten.
Weitere Erklärungen hier , aber mit einem Befehl wie:
sollte die Daten greifen, die Sie suchen.
Als Trick umgeht Windows diese Einschränkung, wenn dem Pfad
\\?\
( msdn ) vorangestellt wird.Ein weiterer Trick, wenn Sie eine Wurzel oder ein Ziel haben, das mit einem langen Pfad beginnt,
SUBST
hilft vielleicht :quelle
\\?\
nicht für die Kommandozeile zu funktionieren. Eine weitere Idee mitSUBST
Von http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ :
Der erste Teil durchläuft nur diesen und die Unterordner. Mit
-ErrorVariable AccessDenied
Mitteln schieben Sie die beleidigenden Elemente in die Powershell-VariableAccessDenied
.Sie können dann die Variable wie folgt durchsuchen
Wenn Sie sich nicht für diese Dateien interessieren (kann in einigen Fällen zutreffen), lassen Sie das
-ErrorVariable AccessDenied
Teil einfach fallen .quelle
$_.TargetObject
es nicht den vollständigen Pfad zu verletzenden Dateien enthält, sondernMAX_PATH
nur Verzeichnisnamen und den übergeordneten Verzeichnisnamen der fehlerhaften Dateien. Ich arbeite daran, eine Nicht-Robocopy- oder Subst- oder Xcopy-Lösung zu finden, und werde sie veröffentlichen, wenn ich eine funktionierende Lösung finde.TLPD ("Too Long Path Directory") ist das Programm, das mich gerettet hat. Sehr einfach zu bedienen:
https://sourceforge.net/projects/tlpd/
quelle
Für Pfade größer als 260:
Sie können verwenden:
Beispiel für 14 Zeichen:
So zeigen Sie die Pfadlängen an:
Erhalten Sie Pfade größer als 14:
Bildschirmfoto:
Für Dateinamen größer als 10:
Bildschirmfoto:
quelle