Lote localizar e copiar arquivos de uma lista de arquivos

2

Eu tenho uma unidade com vários milhares de imagens nele. Copiei tudo para outra unidade em que os organizei lentamente ao longo de vários meses. Eu descobri uma tonelada de arquivos corrompidos, mas descobri que na unidade original, eles não estão corrompidos.

O que eu gostaria de fazer é ter um arquivo em lote que lerá nomes de arquivos de um arquivo de texto e pesquisará o nome do arquivo original, copiando-o para uma pasta especificada.

Como a unidade original não está classificada, pode haver duplicatas, portanto, eu gostaria de copiar todas as cópias desse nome de arquivo para a nova pasta. Eu tenho um script que pode fazer isso (veja abaixo), mas não parece estar funcionando por causa dos longos nomes de arquivos. Por exemplo, " 2008-06-27 02.06.37.jpg " ... o script pesquisará " 2008-06-27 " em vez do nome completo do arquivo.

Alguma ideia de como corrigir isso?

Aqui está o meu trabalho que até agora ainda não está funcionando como esperado:

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

cls

set dest=F:\ERRORS\recovered

for /f %%f in (F:\ERRORS\errorlist.txt) do (

    set i=1

    for /f "tokens=*" %%F IN ('dir /S /B /A:-D "%%f"') Do (

        for %%N in ("%%F") Do (

            set name=%%~NN

            set ext=%%~XN

        )

        copy "%%F" "%dest%\!name!_!i!!ext!"

        set /A i=!i!+1

    )

)

ENDLOCAL
    
por JMasters 05.03.2017 / 19:36

1 resposta

1

Você deve adicionar o "TOKENS=*" ao loop FOR /F que lê da lista de arquivos para garantir que as linhas lidas na lista de arquivos que possuem espaços entre caracteres literais não sejam interpretadas como um delimitador ou uma nova linha, eliminando assim a cadeia de caracteres iterada no espaço e não obtendo toda a linha de caracteres necessária para percorrer os espaços antes do retorno de linha ou dos feeds de linha.

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION
cls

set dest=F:\ERRORS\recovered
for /f "TOKENS=*" %%f in (F:\ERRORS\errorlist.txt) do (
    set i=1
    for /f "tokens=*" %%F IN ('dir /S /B /A:-D "%%~f"') Do (
        for %%N in ("%%F") Do (
            set name=%%~NN
            set ext=%%~XN
        )
        copy "%%~F" "%dest%\!name!_!i!!ext!"
        set /A i=!i!+1
    )
)
ENDLOCAL

Mais recursos

  • FOR /?

       tokens=x,y,m-n  - specifies which tokens from each line are to
                          be passed to the for body for each iteration.
                          This will cause additional variable names to
                          be allocated.  The m-n form is a range,
                          specifying the mth through the nth tokens.  If
                          the last character in the tokens= string is an
                          asterisk, then an additional variable is
                          allocated and receives the remaining text on
                          the line after the last token parsed.
    
por 05.03.2017 / 21:25