Переместить датированные файлы в соответствующие им датированные папки
840
Michael
У меня есть файлы .pdf с датой в конце их названия, например, «BINNAWAY - WERRIS CK - 483.94 - 120612».
У меня есть папки, названные в честь дат каждого из этих файлов, например, «12-06-2012».
Как я могу переместить все файлы в соответствующие папки на основе даты в их имени?
Я на Windows XP.
Буду признателен за любые советы.
Спасибо
3 ответа на вопрос
1
user309970
@and31415 Your code has worked on some of the files. But there are many others where it hasn't worked because all files are not in the format <name1> - <name2> - <some numbers> - <date> as assumed. Some may be in the format <name1> - <some numbers> - <date> or something else slightly different. However, all files will end with - <date>, in the following possible arrangements: "- 120612", "- 120612 (1)", "- 120612 (2)", or "- No Date". How can I make it so that only the text after the last hyphen is considered?
Appreciate all your help.
Michael
0
and31415
The following batch script assumes that:
All file names are in the format <name> - [...] - <some numbers> - <date>.
All years are in the range 2000-2099.
Just copy and paste the code in a new text file and save it as MoveFiles.cmd (or whatever as long as you keep the .cmdextension).
@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
Ensure the retrieved characters are actually numbers:
The variable is echoed and then piped to the findstr command, which will use a regular expression to match alphabetical characters.
^ matches beginning of line;
\" matches a straight quote character (");
[0-9] defines a character class which matches any character from 0 to 9;
* repeats zero or more occurrences of the previous class;
$ matches end of line.
Additionally, the regular expression will try to match as much valid dates as possible. The !errorlevel! variable will be set to 0 if there's a match, or 1 otherwise. The findstr output will be then redirected to nul, thus ignored.
Create the target folder in case it doesn't exist already.
Некоторые файлы также могут быть названы: «BINNAWAY - WERRIS CK - 483.94 - 120612 (1)» или «BINNAWAY - WERRIS CK - 483.94 - 120612 (2)» или «BINNAWAY - WERRIS CK - 483.94 - Нет даты», но они отсутствуют » Их слишком много, поэтому я был бы рад просто перенести те, которые заканчиваются на дату, такие как «BINNAWAY - WERRIS CK - 483.94 - 120612». Кроме того, я открыл папку со всеми файлами PDF и запустил скрипт в командной строке (я полагаю, для этого и нужен скрипт), но ничего не произошло. Ваш сценарий предполагает, что мне нужно указать папку, содержащую все датированные папки где-нибудь?
user309970 10 лет назад
0
@ user309970 Я улучшил скрипт для обработки файлов с именами, такими как `BINNAWAY - WERRIS CK - 483.94 - 120612 (1)`, и исправил ошибку, связанную с получением даты. Файлы без действительных номеров не будут перемещены. Возможно, я не достаточно ясно дал понять, но, будучи пакетным скриптом, он не предназначен для запуска как есть: вам нужно сохранить код в новом текстовом файле и убедиться, что [расширение] (http: // support). microsoft.com/kb/865219/en-us) это `.cmd`. Затем вы можете просто переместить пакетный скрипт в папку, содержащую файлы `.pdf`, и дважды щелкнуть по нему, чтобы выполнить его код. Успешно протестировано с Windows XP и 7.
and31415 10 лет назад
0
0
user263743
Здравствуйте, я подумал, что буду сообщать о достигнутом прогрессе и давать отзывы на свои вопросы. Чтобы учесть файлы с форматом именования <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 :)
С тех пор я обновил свой оригинальный скрипт, чтобы он работал с любыми файлами, заканчивающимися на `- `.
and31415 10 лет назад
0