2

У меня есть диск с несколькими тысячами картинок. Я скопировал все это на другой диск, на котором я организовал их медленно в течение нескольких месяцев. Я обнаружил массу поврежденных файлов, но обнаружил, что на исходном диске они не повреждены.

То, что я хотел бы сделать, это иметь пакетный файл, который будет читать имена файлов из текстового файла и искать на исходном диске имя файла, а затем скопировать его в указанную папку.

Поскольку исходный диск не отсортирован, могут быть дубликаты, поэтому я хотел бы скопировать все копии этого имени файла в новую папку. У меня есть скрипт, который может это сделать (см. Ниже), но он не работает из-за длинных имен файлов. Например, « 2008-06-27 02.06.37.jpg » ... скрипт будет искать « 2008-06-27 » вместо полного имени файла.

Есть мысли о том, как это исправить?

Вот моя работа, которая до сих пор не работает, как ожидалось:

@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

1 ответ1

1

Вы должны добавить "TOKENS=*" в цикл FOR /F который читает из списка файлов, чтобы гарантировать, что строки, считываемые из списка файлов, которые имеют пробелы между литеральными символами, не будут интерпретироваться как разделитель или новая строка, таким образом отрезая символьная строка повторяется в пробеле и не получает всю строку символов, вам нужно ее перебрать, включая пробелы до возврата каретки или перевода строки

@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

Дополнительные ресурсы

  • 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.
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .