Używam xcopy w skrypcie systemu Windows XP, aby rekurencyjnie skopiować katalog. Ciągle pojawia się błąd „Za mało pamięci”, co rozumiem, ponieważ plik, który próbuję skopiować, ma zbyt długą ścieżkę. Mogę łatwo zmniejszyć długość ścieżki, ale niestety nie mogę ustalić, które pliki naruszają ograniczenie długości ścieżki. Pliki, które są kopiowane, są drukowane na standardowe wyjście (które przekierowuję do pliku dziennika), ale komunikat o błędzie jest drukowany na terminalu, więc nie mogę nawet zorientować się, w którym katalogu błąd jest podawany .
windows
windows-xp
xcopy
max-path
WestHamster
źródło
źródło
Odpowiedzi:
wykonaj a,
dir /s /b > out.txt
a następnie dodaj prowadnicę w pozycji 260W PowerShell
cmd /c dir /s /b |? {$_.length -gt 260}
źródło
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.
Wraz z nim drukowana jest tylko skrócona ścieżka. npD:\Dropbox\ProY...sh._setbinddata
. : . To są dokładnie ścieżki, które chcę znaleźć, ale nie widzę całej ścieżki! Jakoś to obejść?Get-ChildItems -r *
przestaje widzieć plik ...dir /s /b
działa tylko dla mnie.W tym celu stworzyłem narzędzie Path Length Checker , które jest przyjemną, bezpłatną aplikacją z graficznym interfejsem użytkownika, za pomocą której możesz zobaczyć długości ścieżek wszystkich plików i katalogów w danym katalogu.
Napisałem również i opublikowałem na blogu o prostym skrypcie PowerShell do pobierania długości plików i katalogów. Wyświetli długość i ścieżkę do pliku i opcjonalnie zapisze go również w konsoli. Nie ogranicza się do wyświetlania plików, które mają tylko określoną długość (łatwa modyfikacja), ale wyświetla je malejąco według długości, więc nadal bardzo łatwo jest zobaczyć, które ścieżki przekraczają twój próg. Oto ona:
źródło
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.
PathLengthChecker.exe RootDirectory="C:\[MyFolder]" MinLength=248
, podczas gdyecho SELECT sync_folder FROM session_table;| sqlite3.exe %LocalAppData%\SynologyDrive\data\db\sys.sqlite
był potrzebny do programowego pobrania folderów współdzielonych. (Jeśli jesteś zainteresowany pełnym kodem, możesz zapytać)$_.FullName
po prostu zastąp go$_.Name
wszędzie; dzięki temu zamiast pełnej ścieżki otrzymasz nazwę pliku.Jako udoskonalenie najprostszego rozwiązania, a jeśli nie możesz lub nie chcesz zainstalować Powershell, po prostu uruchom:
lub (szybciej):
A linie dłuższe niż 260 zostaną umieszczone na początku listy. Zauważ, że musisz dodać 1 do parametru kolumny SORT (/ + n).
źródło
Zrobiłem alternatywę dla innych dobrych odpowiedzi tutaj, które używają PowerShell, ale moja również zapisuje listę do pliku. Podzielę się tym tutaj na wypadek, gdyby ktoś inny chciał czegoś takiego.
Ostrzeżenie: kod nadpisuje plik „longfilepath.txt” w bieżącym katalogu roboczym. Wiem, że jest mało prawdopodobne, że już go masz, ale na wszelki wypadek!
Celowo chciałem to w jednej linii:
Szczegółowe instrukcje:
cat longfilepath.txt | sort
Wyjaśnienie:
Out-File longfilepath.txt ;
- Utwórz (lub nadpisz) pusty plik o nazwie „longfilepath.txt”. Średnik do oddzielania poleceń.cmd /c "dir /b /s /a" |
- Uruchom polecenie dir w PowerShell,/a
aby wyświetlić wszystkie pliki, w tym pliki ukryte.|
do rury.ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
- Dla każdej linii (oznaczonej jako $ _), jeśli długość jest większa niż 250, dołącz tę linię do pliku.źródło
możesz przekierować stderr.
więcej wyjaśnień tutaj , ale mając polecenie takie jak:
powinien pobrać dane, których szukasz.
Ponadto, jako sztuczka, system Windows omija to ograniczenie, jeśli ścieżka jest poprzedzona prefiksem
\\?\
( msdn )Inna sztuczka, jeśli masz korzeń lub miejsce docelowe, które zaczyna się od długiej ścieżki, być
SUBST
może pomoże:źródło
\\?\
to, że nie działa dla wiersza poleceń. Dodano inny pomysł przy użyciuSUBST
Od http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ :
pierwsza część po prostu przechodzi przez to i podfoldery; za pomocą
-ErrorVariable AccessDenied
środków wypycha niewłaściwe elementy do zmiennej PowerShellAccessDenied
.Następnie możesz przejrzeć zmienną w ten sposób
Jeśli nie dbasz o te pliki (może to mieć zastosowanie w niektórych przypadkach), po prostu usuń
-ErrorVariable AccessDenied
część.źródło
$_.TargetObject
nie zawiera pełną ścieżkę do plików , które naruszająMAX_PATH
, tylko nazwy katalogów , a także nazwę katalogu nadrzędnego plików przestępczych. Pracuję nad znalezieniem rozwiązania innego niż Robocopy lub Subst lub Xcopy i napiszę, gdy znajdę działające rozwiązanie.TLPD („zbyt długa ścieżka”) to program, który mnie uratował. Bardzo łatwy w użyciu:
https://sourceforge.net/projects/tlpd/
źródło
W przypadku ścieżek większych niż 260:
możesz użyć:
Przykład na 14 znakach:
Aby wyświetlić długości ścieżek:
Uzyskaj ścieżki większe niż 14:
Zrzut ekranu:
W przypadku nazw plików większych niż 10:
Zrzut ekranu:
źródło