Nazwa katalogu jest zbyt długa wsadowo

4

Zadałem już pytanie w przepełnieniu stosu, ale nie otrzymałem żadnej odpowiedzi od nikogo. Zadaję tutaj to samo pytanie.

Usiłuję stworzyć program, który obliczy rozmiar wszystkich folderów obecnych w określonej lokalizacji lub bieżącej lokalizacji za pomocą skryptu wsadowego i zapisuję go w pliku .csv

Podążyłem za tym pytaniem w przepełnieniu stosu

https://stackoverflow.com/questions/21711180/how-to-list-all-folder-with-size-via-batch-file

a mój kod to

`@echo off
 setlocal disabledelayedexpansion
 set "folder=%~1"
 Set "Value=0"
 if not defined folder set "folder=%cd%"
  (for /d %%a in ("%folder%\*") do (
    set "size=0"
    for /f "tokens=3,5" %%b in ('dir /-c /a /w /s /x "%%~fa\*" ^| findstr /b /c:"  "')do if "%%~c"=="" set "size=%%~b"
   setlocal enabledelayedexpansion
   echo(%%~nxa , !size!
   endlocal
  ))>>foldersize.csv 
endlocal
exit /b`

Po uruchomieniu kodu pojawia się błąd

Nazwa katalogu „nazwa_katalogu” jest za długa

Wiedziałem już, że maksymalna długość nazwy ścieżki systemu Windows wynosi 260 znaków i może to być przyczyną tego błędu.

Czy jest jakiś sposób, aby rozwiązać ten problem?

Z góry dziękuję za każdą odpowiedź.

ajith
źródło
Czy możesz to zrobić, używając konwencji nazewnictwa 8.3 starego stylu, tak jakbyś pisał kod do uruchomienia w systemie Windows 3.1?
fixer1234,

Odpowiedzi:

8

Na partycji NTFS maksymalna długość ścieżki wynosi około 32 760 znaków (coś nieco mniej niż 32 767). Ale MAX-PATH ma nadal 260. Ścieżki dłuższe niż „MAX-PATH” są nadal dostępne i są nazywane „ścieżką o przedłużonej długości”.

Zgodnie z tą stroną: Ograniczenie maksymalnej długości ścieżki

Aby określić ścieżkę o przedłużonej długości, użyj przedrostka „\\? \”. Na przykład „\\? \ D: \ bardzo długa ścieżka”.

Należy również pamiętać, że „ścieżka o przedłużonej długości” jest zawsze ścieżką „absolutną”. Nie można określić „formy względnej” „ścieżki o przedłużonej długości”.

Nie próbowałem uruchomić dokładnego skryptu, ale wykonałem trochę testów z wiersza polecenia i wygląda na to, że jest wykonalny.

Na przykład:

@for /f "usebackq delims=" %f in (`dir /s /b "\\?\c:\Blah"`) do @echo %f

Zwraca listę taką jak:

\\?\c:\Blah\test
\\?\c:\Blah\test\aaa
\\?\c:\Blah\test\bbb
\\?\c:\Blah\test\aaa\folder1
\\?\c:\Blah\test\aaa\folder2
\\?\c:\Blah\test\aaa\folder1\File1.txt
\\?\c:\Blah\test\aaa\folder1\File2.txt
\\?\c:\Blah\test\aaa\folder2\File1.txt
\\?\c:\Blah\test\aaa\folder2\File2.txt
\\?\c:\Blah\test\bbb\folder1
\\?\c:\Blah\test\bbb\folder2
\\?\c:\Blah\test\bbb\folder1\Diff.txt
\\?\c:\Blah\test\bbb\folder1\Same.txt
\\?\c:\Blah\test\bbb\folder2\Diff.txt
\\?\c:\Blah\test\bbb\folder2\Same.txt

I:

C:>dir /-c /a /w /s /x "\\?\c:\Blah" | findstr /b /c:"  "

Zwroty:

           0 File(s)              0 bytes
           0 File(s)              0 bytes
           2 File(s)            660 bytes
           2 File(s)            654 bytes
           0 File(s)              0 bytes
           2 File(s)            654 bytes
           2 File(s)            660 bytes
 Total Files Listed:
           8 File(s)           2628 bytes
          20 Dir(s)      3268722688 bytes free

Co nie wygląda na to, że jest dokładnie to, czego potrzebujesz, więc twoje polecenie „dir / findstr” będzie wymagało pewnej korekty.

Nie mam żadnych ścieżek \ plików zawierających więcej niż 260 znaków, więc nie mogę powiedzieć, co się dzieje z „bardzo długimi” ścieżkami, ale powinno działać.


Jeśli ścieżka, której używasz, jest ścieżką UNC, strona, do której prowadzi link, mówi:

Prefiksu „\\? \” Można także używać ze ścieżkami zbudowanymi zgodnie z uniwersalną konwencją nazewnictwa (UNC). Aby określić taką ścieżkę za pomocą UNC, użyj prefiksu „\\? \ UNC \”. Na przykład
„\\? \ UNC \ server \ share”, gdzie „server” to nazwa komputera, a „share” to nazwa folderu udostępnionego. Te przedrostki nie są używane jako część samej ścieżki.

Przykład pasowania do ścieżki UNC podanej w komentarzu powinien zostać określony w następujący sposób:

dir /-c /a /w /s /x "\\?\UNC\10.0.0.10\folder1\folder2" | findstr /b /c:" "
Kevin Fegan
źródło
Dziękuję za odpowiedź. W moim przypadku lokalizacją jest adres sieciowy, więc jeśli wstawię tę lokalizację do polecenia, które podałeś, stanie się ona jak katalog / -c / a / w / s / x "\\? \\\ 10.91.49.10 \ folder1 \ folder2 "| findstr / b / c: "" Po uruchomieniu tego polecenia
pojawia
@ajith - Dodałem więcej do mojej odpowiedzi, aby to wyjaśnić ... Aby określić ścieżkę UNC, musisz użyć prefiksu: w "\\?\UNC\"ten sposób:dir /-c /a /w /s /x "\\?\UNC\10.0.0.10\folder1\folder2" | findstr /b /c:" "
Kevin Fegan
1
Nawet po zmianie polecenia, tak jak powiedziałeś (dodałem \\? \ UNC \), wciąż
pojawia
2
Wiem, że to stare pytanie, ale jak powiedział ajith - żadne z tych nie działa dla mnie, poprzedziłem je \\? \ I \\? \ UNC \ i zamapowałem na K: drive i zrobił \\? \ K: \ wszystkie z nich nadal powodują, że nazwa pliku lub rozszerzenie jest za długie
StanM
0

Jedyny sposób, w jaki widzę, aby działał, zakładając, że fizyczny serwer przechowujący informacje nie ma problemu z dostępem do tych samych folderów, polega na zamapowaniu litery dysku na folder, w którym rozpoczyna się proces przejścia do katalogu, usuwając adres komputera i udostępnij nazwę z długości ścieżki.

MC ND
źródło