Il nome della directory è troppo lungo in batch

Ho già fatto la domanda in overflow dello stack, ma non ho ricevuto alcuna risposta da nessuno. Quindi, sto anche facendo la stessa domanda qui.

Sto provando a creare un programma che calcolerà la dimensione di tutte le cartelle presenti nella posizione specificata o nella posizione corrente usando uno script batch e lo scrivo in un file .csv

Ho seguito questa domanda in stackoverflow

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

e il mio codice è

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

Quando eseguo il codice, sto ottenendo un errore

Il nome della directory "dir_name" è troppo lungo

Ho già saputo che la lunghezza massima per un nome di path Windows è di 260 caratteri e potrebbe essere la causa di questo errore.

C'è un modo per risolvere questo problema?

Ringraziamenti in anticipo per each risposta.

Su una partizione NTFS, la lunghezza massima del path è di circa 32.760 caratteri (qualcosa leggermente inferiore a 32.767). Tuttavia, MAX-PATH è ancora 260. I routes più lunghi di "MAX-PATH" sono ancora accessibili e vengono definiti come "path a lunghezza prolungata".

Secondo questa pagina: Limitazione massima del path

Per specificare un path a lunghezza estesa, utilizzare il prefisso "\\? \". Ad esempio, "\\? \ D: \ path molto lungo".

Ricorda inoltre che un "path esteso" è sempre un path "assoluto". Non è ansible specificare una "forma relativa" di un "path esteso".

Non ho provato a eseguire il tuo script esatto, ma ho fatto un piccolo test da un prompt dei comandi e sembra che sia ansible.

Per esempio:

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

Restituisce un elenco come:

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

E:

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

Ritorni:

  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 

Quello che non sembra esattamente quello che ti serve, quindi il tuo command "dir / findstr" avrà bisogno di una certa regolazione.

Non ho routes \ file più di 260 caratteri, quindi non riesco a capire cosa succede con routes "molto lunghi", ma dovrebbe funzionare.


Se il path che utilizza è un path UNC, la pagina collegata sopra dice questo:

Il prefisso "\\? \" Può essere utilizzato anche con routes costruiti secondo la convenzione di denominazione universale (UNC). Per specificare un path che utilizza UNC, utilizzare il prefisso "\\? \ UNC \". Per esempio,
"\\? \ UNC \ server \ share", where "server" è il nome del computer e "condivisione" è il nome della cartella condivisa. Questi prefissi non vengono utilizzati come parte del path stesso.

Un esempio per adattare il path UNC che hai dato nel tuo commento dovrebbe essere specificato in questo modo:

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

L'unico modo che vedo per funzionare, supponendo che il server fisico che detiene le informazioni non abbia problemi a accedere alle stesse cartelle, è quello di mappare una lettera di unità alla cartella where inizia il process di traversal della directory, rimuovendo l'indirizzo del computer e condividere il nome dalla lunghezza del path.