Script em lote rápido do NT para determinar comprimentos de caminho em uma pasta

2

Gostaria de saber se alguém criou uma maneira eficiente no lote NT de comprimentos de caminho de computação em uma determinada pasta. Isso é necessário para identificar arquivos e pastas que não serão arquivados com êxito em mídia ótica, que continuam impondo limites de caminho de 260 caracteres, embora o NTFS agora ofereça caminhos de até 32.767 caracteres.

Eu tenho usado um script em lote que funciona fazendo eco de cada caminho completo para um arquivo, medindo o tamanho do arquivo e subtraindo 2 para obter a contagem de caracteres no caminho. Isso funciona bem para contagens baixas de arquivos, mas leva muito tempo para concluir contagens altas de arquivos. Idealmente, eu gostaria de algo que funciona quase tão rápido quanto o comando 'dir' em si.

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

set Limit=%~1
echo Paths being found which exceed !Limit!
echo ======================================
type NUL > "!temp!\tabulator.txt"
FOR /F "tokens=1 delims=" %%A IN ('dir /o:-n /b /s') DO (
set Test=%%A
call set Test=%%Test:~%Limit%%%.
IF !Test! NEQ . (
type NUL > "!temp!\pathlengthdeterminationtemp.txt"
echo %%A > "!temp!\pathlengthdeterminationtemp.txt"
FOR /F "tokens=1 delims=" %%H IN ('dir /s /o /b "!temp!\pathlengthdeterminationtemp.txt"') DO set StrLen=%%~zH
del "!temp!\pathlengthdeterminationtemp.txt"
set /a StrLen=!StrLen!-2
echo !StrLen!,%%A>> "!temp!\tabulator.txt"
)
)

sort "!temp!\tabulator.txt" /O "!temp!\tabulator1.txt"
del "!temp!\tabulator.txt"
TYPE "!temp!\tabulator1.txt"
del "!temp!\tabulator1.txt" 

ENDLOCAL
    
por J N Winkler 18.11.2013 / 16:08

2 respostas

2

Para verificar o tamanho de uma variável de ambiente, você pode fazer algo semelhante a isto:

set a=1234567890123

if [%a:~0,-12%]==[] (
    echo a is shorter than 13
) else (
    echo %a% is longer than 12
)

A expressão %a:~0,-12% retorna todos menos os últimos 12 caracteres da variável a .

Digite set /? para obter detalhes.

No entanto, não tenho certeza se isso também funciona com NT . Eu testei como CMD script em Windows 7 .

    
por 18.11.2013 / 16:52
0

Não há um comando interno para determinar o tamanho de uma string em um arquivo de lote. Isso envolve necessariamente hacks feios como escrever em um arquivo. No entanto, é relativamente fácil verificar se uma string excede um tamanho fixo, como o limite de 260 caracteres. O script a seguir captura uma substring de 260 caracteres e testa a igualdade. Se ambas as variáveis não corresponderem, o caminho será considerado longo e impresso.

@echo off
setlocal enabledelayedexpansion
for /F "tokens=1 delims=" %%i in ('dir /o:-n /b /s') do (
    set filename=%%i
    set part=!filename:~0,260!
    if !filename! NEQ !part! echo !filename!
)
    
por 18.11.2013 / 17:09