4

Я уже задавал вопрос по переполнению стека, но не получил ответа ни от кого. Поэтому я задаю тот же вопрос и здесь.

Я пытаюсь сделать программу, которая будет вычислять размер всей папки, присутствующей в указанном месте или текущем месте, используя пакетный скрипт, и я записываю его в файл .csv

Я следил за этим вопросом в stackoverflow

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

и мой код

`@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`

Когда я запускаю код, я получаю сообщение об ошибке

Имя каталога "dir_name" слишком длинное

Я уже знал, что максимальная длина имени пути Windows составляет 260 символов, и это может быть причиной этой ошибки.

Есть ли способ, которым я могу решить эту проблему ??

Заранее спасибо за каждый ответ.

2 ответа2

8

В разделе NTFS максимальная длина пути составляет около 32 760 символов (что немного меньше, чем 32 767). Но MAX-PATH все еще 260. Пути, более длинные, чем «MAX-PATH», по-прежнему доступны и называются "путь расширенной длины".

Согласно этой странице: ограничение максимальной длины пути

Чтобы указать путь расширенной длины, используйте "\\?\" префикс. Например, "\\?\D:\ очень длинный путь ".

Также имейте в виду, что "путь расширенной длины" всегда является "абсолютным" путем. Вы не можете указать "относительную форму" "расширенного пути".

Я не пытался запустить ваш точный сценарий, но я провел небольшое тестирование из командной строки, и кажется, что это работоспособно.

Например:

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

Возвращает список как:

\\?\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

А также:

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

Возвращает:

           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

Это не похоже на то, что вам нужно, поэтому вашей команде "dir/findstr" потребуется некоторая корректировка.

У меня нет путей \ файлов длиной более 260 символов, поэтому я не могу сказать, что происходит с "очень длинными" путями, но это должно работать.


Если используемый вами путь - это UNC-путь, то на странице, указанной выше, сказано следующее:

"\\?Префикс \"также можно использовать с путями, созданными в соответствии с универсальным соглашением об именах (UNC). Чтобы указать такой путь с помощью UNC, используйте "\\?\UNC \"префикс. Например,
«\\?\UNC \server \share ", где" server "- это имя компьютера, а" share "- это имя общей папки. Эти префиксы не используются как часть самого пути.

Пример, соответствующий пути UNC, который вы указали в комментарии, должен быть указан следующим образом:

dir /-c /a /w /s /x "\\?\UNC\10.0.0.10\folder1\folder2" | findstr /b /c:" "
0

Единственный способ, как я вижу, чтобы он работал, при условии, что физический сервер, на котором хранится информация, не имеет проблем с доступом к тем же папкам, - это сопоставить букву диска с папкой, в которой начинается процесс обхода каталога, удаляя адрес компьютера и поделиться именем из длины пути.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .