Frage

Ich verwende ein xcopy in einem XP-Windows-Skript, um ein Verzeichnis rekursiv zu kopieren.Ich erhalte ständig die Fehlermeldung „Nicht genügend Speicher“, was meiner Meinung nach darauf zurückzuführen ist, 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 auf der Standardausgabe ausgegeben (die ich in eine Protokolldatei umleite), aber die Fehlermeldung wird auf dem Terminal ausgegeben, sodass ich nicht einmal ungefähr herausfinden kann, für welches Verzeichnis der Fehler ausgegeben wird .

War es hilfreich?

Lösung

machen einen dir /s /b > out.txt und fügen Sie an der Position 260

einen Führer hinzu

in Powershellcmd /c dir /s /b |? {$_.length -gt 260}

Andere Tipps

Ich erstellte das Pfadlängen-Checker-Tool für diesen Zweck, einer schönen, kostenlosen GUI-App, die das istSie können verwenden, um die Pfadlängen aller Dateien und Verzeichnisse in einem bestimmten Verzeichnis anzuzeigen.

Ich habe auch geschrieben und über ein einfaches Powershell-Skript Zum Erhalten von Datei- und Verzeichnislängen.Es wird die Länge und den Pfad in eine Datei ausgeben, und schreibt es optional auch an die Konsole.Es ist nicht bekannt, Dateien anzuzeigen, die nur über eine bestimmte Länge sind (eine einfache Modifizierung zum Herstellen), sondern zeigt, dass sie mit der Länge absteigend sind, sodass er noch super leicht zu sehen ist, welchen Pfaden über Ihre Schwelle sind.Hier ist es:

generasacodicetagpre.

als Verfeinerung der einfachsten Lösung, und wenn Sie PowerShell nicht installieren möchten oder nicht möchten, laufen Sie einfach:

generasacodicetagpre.

oder (schneller):

generasacodicetagpre.

und Zeilen länger als 260 gelangen an die Spitze der Auflistung.Beachten Sie, dass Sie 1 zum Sortieren von Spaltenparameter (/ + n) hinzufügen müssen.

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

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

wollte es absichtlich in einer einzigen Zeile:

generasacodicetagpre.

detaillierte Anweisungen:

    .
  1. run pounerhell
  2. Traverse zum Verzeichnis, das Sie nach FilePath-Längen überprüfen möchten (C: Works)
  3. kopieren und fügen Sie den Code zu kopieren und einfügen [Klicken Sie mit der rechten Maustaste in PowerShell oder Alt + Leerzeichen> E> P]
  4. warten, bis es fertig ist, und dann die Datei anzeigen: cat longfilepath.txt | sort
  5. Erläuterung:

    Out-File longfilepath.txt ; - Erstellen (oder überschreiben) eine leere Datei mit dem Titel 'longfilepath.txt'. Halbdolon, um Befehle zu trennen.

    cmd /c "dir /b /s /a" | - Run-DIR-Befehl auf PowerShell, /a, um alle Dateien einschließlich versteckter Dateien anzuzeigen. generakodicetagcode zum rohr.

    | - für jede Zeile (als $ _ bezeichnet), wenn die Länge größer als 250 ist, hängen Sie diese Zeile an die Datei an.

Sie können stderr umleiten.

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

MyCommand >log.txt 2>errors.txt

sollte die gesuchten Daten abrufen.

Als Trick umgeht Windows diese Einschränkung außerdem, wenn dem Pfad das Präfix vorangestellt ist \\?\ (msdn)

Ein weiterer Trick, wenn Sie möglicherweise einen Stamm oder ein Ziel haben, das mit einem langen Pfad beginnt SUBST wird helfen:

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

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

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

Der erste Teil durchläuft lediglich diesen und die Unterordner.verwenden -ErrorVariable AccessDenied bedeutet, dass die fehlerhaften Elemente in die Powershell-Variable verschoben werden AccessDenied.

Anschließend können Sie die Variable wie folgt durchsuchen

$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 manchen Fällen zutreffen), löschen Sie sie einfach -ErrorVariable AccessDenied Teil.

tlpd ("zu langes Pfadverzeichnis") ist das Programm, das mich gespeichert hat. Sehr einfach zu bedienen:

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

für Wege größer als 260:
Sie können verwenden:

generasacodicetagpre.

Beispiel für 14 Zeichen:
So zeigen Sie die Wege-Längen an:

generasacodicetagpre.

Get Wege größer als 14:

generasacodicetagpre.

screenshot:
Eingabebabelle hier eingeben

für Dateinamen größer als 10:

generasacodicetagpre.

screenshot:
Bildbeschreibung eingeben Hier eingeben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top