O nome do diretório é muito longo em lote

4

Já pedi a pergunta no estouro de pilha, mas não obteve resposta de ninguém. Então eu estou fazendo a mesma pergunta aqui também.

Estou tentando criar um programa que calcule o tamanho de todas as pastas presentes no local especificado ou no local atual usando um script em lote e estou escrevendo em um arquivo .csv

Eu segui essa pergunta no stackoverflow

link

e meu código é

'@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 executo o código, estou recebendo um erro

The directory name "dir_name" is too long

Eu já sabia que o comprimento máximo para um nome de caminho do Windows é de 260 caracteres e isso pode ser o motivo desse erro.

Existe alguma maneira de resolver este problema?

Agradecemos antecipadamente por cada resposta.

    
por ajith 09.10.2014 / 10:48

2 respostas

8

Em uma partição NTFS, o comprimento máximo do caminho é de aproximadamente 32.760 caracteres (algo um pouco menor que 32.767). Mas, MAX-PATH ainda é 260. Caminhos mais longos que "MAX-PATH" ainda são acessíveis e são chamados de "caminho de extensão estendida".

De acordo com esta página: Comprimento máximo do caminho Limitação

To specify an extended-length path, use the "\?\" prefix. For example, "\?\D:\very long path".

Lembre-se também de que um "caminho de comprimento estendido" é sempre um caminho "absoluto". Você não pode especificar um "formulário relativo" de um "caminho de comprimento estendido".

Eu não tentei executar seu script exato, mas fiz um pequeno teste em um prompt de comando e parece que é viável.

Por exemplo:

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

Retorna uma 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

E:

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

Retorna:

           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

O que não parece ser exatamente o que você precisa, então seu comando "dir / findstr" precisará de alguns ajustes.

Eu não tenho nenhum caminho \ arquivos com mais de 260 caracteres, então não posso dizer o que acontece com os caminhos "muito longos", mas isso deve funcionar.

Se o caminho que você está usando for um caminho UNC, a página vinculada acima diz o seguinte:

The "\?\" prefix can also be used with paths constructed according to the universal naming convention (UNC). To specify such a path using UNC, use the "\?\UNC\" prefix. For example,
"\?\UNC\server\share", where "server" is the name of the computer and "share" is the name of the shared folder. These prefixes are not used as part of the path itself.

Um exemplo para ajustar o caminho UNC que você deu em seu comentário deve ser especificado assim:

dir /-c /a /w /s /x "\?\UNC.0.0.10\folder1\folder2" | findstr /b /c:" "
    
por 12.10.2014 / 19:30
0

A única maneira que vejo para funcionar, assumindo que o servidor físico que contém as informações não tem nenhum problema ao acessar as mesmas pastas, é mapear uma letra de unidade para a pasta em que o processo de passagem de diretório é iniciado, removendo o endereço do computador e o nome do compartilhamento do comprimento do caminho.

    
por 12.10.2014 / 16:27