El nombre del directorio es demasiado largo en lote

4

Ya hice la pregunta en el desbordamiento de la pila, pero no obtuve ninguna respuesta de nadie. Entonces estoy haciendo la misma pregunta aquí también.

Estoy tratando de hacer un programa que calcule el tamaño de todas las carpetas presentes en la ubicación especificada o la ubicación actual usando un script por lotes y lo estoy escribiendo en un archivo .csv

Seguí esta pregunta en stackoverflow

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

y mi código es

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

Cuando ejecuto el código, recibo un error

El nombre del directorio "dir_name" es demasiado largo

Ya sabía que la longitud máxima para un nombre de ruta de Windows es de 260 caracteres y esa podría ser la razón de este error.

¿Hay alguna manera de resolver este problema?

Gracias de antemano por cada respuesta.

ajith
fuente
¿Puede hacerlo utilizando las convenciones de nomenclatura de estilo antiguo 8.3 como si estuviera escribiendo código para ejecutar en Windows 3.1?
fijador1234

Respuestas:

8

En una partición NTFS, la longitud máxima de la ruta es de aproximadamente 32,760 caracteres (algo menos de 32,767). Pero, MAX-PATH sigue siendo 260. Las rutas más largas que "MAX-PATH" todavía son accesibles y se conocen como "ruta de longitud extendida".

Según esta página: Limitación máxima de la longitud del camino

Para especificar una ruta de longitud extendida, use el prefijo "\\? \". Por ejemplo, "\\? \ D: \ ruta muy larga".

También tenga en cuenta que una "ruta de longitud extendida" es siempre una ruta "absoluta". No puede especificar una "forma relativa" de una "ruta de longitud extendida".

No he intentado ejecutar su script exacto, pero he hecho algunas pruebas desde el símbolo del sistema y parece que es viable.

Por ejemplo:

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

Devuelve una lista como:

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

Y:

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

Devoluciones:

           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

Lo cual no parece ser exactamente lo que necesita, por lo que su comando "dir / Findstr" necesitará algún ajuste.

No tengo ninguna ruta \ archivos que tengan más de 260 caracteres, por lo que no puedo decir qué sucede con las rutas "muy largas", pero debería funcionar.


Si la ruta que está utilizando es una ruta UNC, la página vinculada anteriormente dice esto:

El prefijo "\\? \" También se puede usar con rutas construidas de acuerdo con la convención de nomenclatura universal (UNC). Para especificar dicha ruta usando UNC, use el prefijo "\\? \ UNC \". Por ejemplo,
"\\? \ UNC \ server \ share", donde "server" es el nombre de la computadora y "share" es el nombre de la carpeta compartida. Estos prefijos no se utilizan como parte de la ruta en sí.

Un ejemplo que se ajuste a la ruta UNC que proporcionó en su comentario, debe especificarse así:

dir /-c /a /w /s /x "\\?\UNC\10.0.0.10\folder1\folder2" | findstr /b /c:" "
Kevin Fegan
fuente
Gracias por su respuesta. En mi caso, la ubicación es una dirección de red, por lo que si coloco esa ubicación en el comando que proporcionó, se convertirá en dir / -c / a / w / s / x "\\? \\\ 10.91.49.10 \ folder1 \ folder2 "| Findstr / b / c: "" Cuando ejecuto este comando, recibo un error como El nombre de archivo, el nombre del directorio o la sintaxis de la etiqueta de volumen es incorrecta
ajith
@ajith: agregué más a mi respuesta para explicar esto ... Para especificar una ruta UNC, debe usar el prefijo: "\\?\UNC\"así:dir /-c /a /w /s /x "\\?\UNC\10.0.0.10\folder1\folder2" | findstr /b /c:" "
Kevin Fegan
1
Incluso después de cambiar el comando como usted ha dicho (añadido \\ \ UNC \?), Todavía estoy consiguiendo el mismo error El nombre de archivo, nombre de directorio o etiqueta del volumen es incorrecto
ajith
2
Sé que esta es una vieja pregunta, pero como dijo ajith, ninguno de los dos funciona para mí, lo puse como prefijo \\? \ Y \\? \ UNC \ y lo asigné a K: drive e \\? \ K: \ todos estos todavía dan como resultado que el nombre de archivo o la extensión es demasiado larga
StanM
0

La única forma en que veo que funciona, suponiendo que el servidor físico que contiene la información no tiene ningún problema para acceder a las mismas carpetas, es asignar una letra de unidad a la carpeta donde comienza el proceso de recorrido del directorio, eliminando la dirección de la computadora y compartir el nombre de la longitud de la ruta.

MC ND
fuente