3

У меня есть файлы .pdf с датой в конце их названия, например, «BINNAWAY - WERRIS CK - 483.94 - 120612».

У меня есть папки, названные в честь дат каждого из этих файлов, например, «12-06-2012».

Как я могу переместить все файлы в соответствующие папки на основе даты в их имени?

Я на Windows XP.

Буду признателен за любые советы.

Спасибо

3 ответа3

1

@ and31415 Ваш код работал с некоторыми файлами. Но есть много других, где это не сработало, потому что все файлы не в формате <name1> - <name2> - <some numbers> - <date> как предполагалось. Некоторые могут быть в формате <name1> - <some numbers> - <date> или что-то еще немного отличающееся. Однако все файлы будут заканчиваться на - <date> в следующих возможных вариантах: «- 120612», «- 120612 (1)», «- 120612 (2)» или «- Без даты». Как сделать так, чтобы учитывался только текст после последнего дефиса?

Ценю всю вашу помощь.

Майкл

0

Здравствуйте, я подумал, что буду сообщать о достигнутом прогрессе и давать отзывы на свои вопросы. Чтобы учесть файлы с форматом именования <name1> - <some numbers> - <date> вместо <name1> - <name2> - <some numbers> - <date> как предполагается @ and31415 в предоставленном им сценарии, я только что изменили tokens=4 на tokens=3 в новом файле .cmd. Это сработало. Но все же многие файлы не были обработаны этими пакетными сценариями. Я выяснил, что скрипт обрабатывает только некоторые файлы в папке (он обрабатывает только 50-100 PDF-файлов, и у меня есть тысячи PDF-файлов, чтобы пройти), поэтому я создал новую папку и выгрузил туда лишние PDF-файлы и запустил пакетные сценарии там. Многие PDF-файлы еще не обработаны, но я собираюсь обработать 50-100 PDF-файлов каждый в новой папке, и это должно быть сделано довольно быстро. Не идеально, но все же намного лучше, чем делать это вручную один за другим! Спасибо за вашу помощь @ and31415 :)

0

Следующий пакетный скрипт предполагает, что:

  • Все имена файлов имеют формат <name> - [...] - <some numbers> - <date> .
  • Все годы в диапазоне 2000-2099 .

Просто скопируйте и вставьте код в новый текстовый файл и сохраните его как MoveFiles.cmd (или любой другой, если у вас есть расширение .cmd).

@echo off
setlocal
setlocal enabledelayedexpansion

for /r %%A in (*.pdf) do (
set date=
call :getLastToken "%%~nA"
for /f "tokens=1" %%B in ("!last!") do set date=%%~B
echo "!date!"|findstr "^\"[0-3][0-9][0-1][0-9]*\"$" >nul
if !errorlevel! == 0 (
set targetFolder=!date:~0,2!-!date:~2,2!-20!date:~4,2!
if not exist "!targetFolder!\" md "!targetFolder!"
move "%%~fA" "!targetFolder!" >nul
))

endlocal & exit /b

:getLastToken
set "str=%~1"
:loop
for /f "tokens=1* delims=-" %%A in ("%str%") do (
set "last=%%A"
set "str=%%B"
)
if defined str goto :loop
exit /b

Как это устроено

  1. Список всех файлов .pdf в текущей папке.

  2. Получить каждое имя файла и токенизировать его.

  3. Убедитесь, что найденные символы на самом деле числа:

    Переменная выводится и затем передается в команду findstr , которая будет использовать регулярное выражение для сопоставления букв алфавита.

    • ^ соответствует началу строки;
    • \" соответствует символу прямой кавычки (");
    • [0-9] определяет класс символов, который соответствует любому символу от 0 до 9;
    • * повторяет ноль или более вхождений предыдущего класса;
    • $ соответствует концу строки.

    Кроме того, регулярное выражение будет пытаться сопоставить как можно больше допустимых дат. !errorlevel! переменная будет установлена в 0 если есть совпадение, или 1 противном случае. Выходные данные findstr будут перенаправлены на nul , поэтому игнорируются.

  4. Создайте целевую папку, если она еще не существует.

  5. Переместить текущий файл в соответствующую папку.

дальнейшее чтение

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