Пакетный файл для перемещения файлов по дате изменения - PullRequest
4 голосов
/ 13 декабря 2011

Я написал командный файл, который создает пустые папки для каждой даты. Моя следующая задача - создать еще один пакетный файл, который будет перемещать каждый файл в каталоге в соответствующую папку с датой в зависимости от даты их изменения. Я читал многочисленные форумы и статьи о том, как мне этого добиться, но, обладая ограниченными знаниями в области пакетных файлов, я просто не могу заставить его работать. Код, который у меня есть в данный момент, показан ниже, хотя, похоже, в нем не указана дата изменения. Любая помощь очень ценится!

SET directory="\directory\path\archive"

FOR /f %%a in ('dir /b "%directory%"') do (

SET fdate=%%~Ta

MOVE "%directory%\%%a" "%directory%\%fdate%"

1 Ответ

11 голосов
/ 13 декабря 2011

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

Я использую формат гггг-мм-дд в именах файлов и папок, поэтому 13 декабря 2011 года будет 2011-12-13. Моя машина использует формат мм / дд / гггг для дат (13.12.2011). Поэтому мне нужно перевести вывод %% ~ tF с 13.12.2011 в 2011-12-13. Примечание - / нельзя использовать в именах файлов или папок.

Так что этот код будет делать то, что вы хотите на моей машине:

set "source=\directory\path\archive"
set "targetRoot=\directory\path\archive"
for %%F in ("%source%\*") do (
  for /f "tokens=1,2,3 delims=/ " %%A in ("%%~tF") do (
    move "%%~fF" "%targetRoot%\%%C-%%A-%%B"
  )
)

Добавление - Вопрос в комментарии просит метод для добавления левой части числа с нулями для создания dir. Я вижу два простых варианта. (Это действительно должен быть другой вопрос)

Этот первый метод прост, но утомителен и не практичен в качестве общего решения

for %%A in (01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31) do ...

Второй метод является общим решением. Поскольку ваше назначение находится в скобках, вам нужно использовать отложенное расширение.

setlocal enableDelayedExpansion
for /l %%A in (1 1 31) do (
  set "day=0%%A"
  set "day=!day:~-2!
  ...
)

Вы увеличиваете число ведущих нулей, добавляя больше 0 вперед, а затем увеличивая количество символов, сохраняемых в операции подстроки.

НО - зачем заранее заполнять каталоги? Ваша стратегия добавит дни каталогов, которых нет в календаре, плюс у вас, вероятно, будет много неиспользуемых папок, для которых в этот день не было изменено ни одного файла. Лучше создавать папки только по мере необходимости. Тогда заполнение 0 для вас уже сделано, и ненужные папки не создаются.

set "source=\directory\path\archive"
set "targetRoot=\directory\path\archive"
for %%F in ("%source%\*") do (
  for /f "tokens=1,2,3 delims=/ " %%A in ("%%~tF") do (
    if not exist "%targetRoot%\%%C\%%A\%%B" mkdir "%targetRoot%\%%C\%%A\%%B"
    move "%%~fF" "%targetRoot%\%%C\%%A\%%B"
  )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...