Отдельный файл по датам - PullRequest
       1

Отдельный файл по датам

3 голосов
/ 20 сентября 2011

Я не могу понять, как разделить файлы по папкам по дате.

У меня есть 1 000 000 файлов, и все файлы в 1 папке делают Проводника больным: P, поэтому я хочу разделить их на разные папки по дате:

01-09-11
02-09-11
03-09-11
и т. Д.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Извлечь дату файла относительно просто, см. HELP CALL и попробуйте этот простой BAT-файл

@echo off
setlocal enabledelayedexpansion
FOR %%A IN (*.*) DO (
  set tf=%%~tA
  echo  %%~fA ... !tf! 
)

Переход от этого подхода к решению вашей проблемы кажется довольно простым ...

@echo off
setlocal enabledelayedexpansion
FOR %%A IN (*.*) DO (
  set tf=%%~tA
  set fd=!tf:~0,10!
  md !fd! 
  move /Y %%~fA !fd! 
)

но, подождите, этот код не гарантированно выполняется.Существуют некоторые зависимости от формата даты, которые могут помешать выполнению этого простого кода.Обработка дат в BAT-файле не легка, потому что формат даты зависит от локали и даже от пользовательских предпочтений.В этом конкретном фрагменте он будет играть хаос в случае, если разделитель даты, например, /;или если формат даты использует две цифры для года вместо четырех, делая дату, чтобы заполнить только 8 позиций вместо 10 ... Вариации формата и, следовательно, возможные ошибки этого кода бесконечны.

Одним из возможных решений является мгновенное изменение формата даты на известный формат.Вставьте этот код перед циклом

....
reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f >nul
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy-MM-dd" /f >nul
reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH:mm:ss" /f >nul
...

и затем вернитесь к исходному, после цикла.

...
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f >nul
...
0 голосов
/ 21 сентября 2011

Ниже приведена пакетная программа, позволяющая указать дату для сравнения в формате мм дд гггг. Затем вы можете указать «вкл. И до» или «вкл. И после» даты и папки назначения. Он даже создаст папку, если она не существует. тогда скрипт переместит файлы.

@ECHO OFF
ECHO Please ensure you are running this batch file from the directory where the files reside. If not, please press CTRL+C to cancel this script and move it to the correct location, then run it again.
PAUSE
SET BorA=none
ECHO Please enter the full path of where you wish your files to be moved to. Example would be C:\Documents and Settings\mechaflash\Desktop\move_folder. Please do not include a trailing \.
SET /p _path=" "

:_date
SET _correct=none
SET /p mm="Two digit month. E.G. 10 = October  "
SET /p dd="Two digit day. E.G. 10 = Day 10  "
SET /p yyyy="4 digit year. E.G. 2010 = Year 2010  "
ECHO Is the date %mm%/%dd%/%yyyy% correct? [1] Yes or [2] No?
SET /p _correct=" "
IF %_correct% EQU 1 GOTO:BorA
IF %_correct% EQU 2 (GOTO:_date) ELSE (ECHO Sorry, you entered an invalid option. & GOTO:_date)
IF "%_correct%"=="none" ECHO Sorry, you entered an invalid option. & GOTO:_date

:BorA
ECHO Would you like to select all files on and before [1], or on and after [2] your entered date of %mm%/%dd%/%yyyy% ?
SET /p BorA=" "
IF %BorA% EQU 1 SET _oper=LEQ
IF %BorA% EQU 2 (SET _oper=GEQ) ELSE (Echo Sorry, you entered an invalid option.  & GOTO:BorA)
IF "%BorA%"=="none" ECHO Sorry, you entered an invalid option. & GOTO:BorA
SET _date=%yyyy%%mm%%dd%
IF NOT EXIST %_path%\NUL MKDIR %_path%

SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%A IN (*.*) DO (
 SET var=%%~tA
 SET var2=!var:~0,-9!
 FOR /F "USEBACKQ tokens=1-3 delims=/" %%F IN (`ECHO !var2!`) DO (
  IF %%H%%F%%G %BorA% %_date% MOVE /Y "%%A" "%_path%\~nxA"
 )
)

установка var в %% ~ tA возвращает дату и время файлов. установка var2 в! var: ~ 0, -9! удаляет время и оставляет только дату. Следующий цикл FOR удаляет / из даты и преобразовывает его в формат ггггммдд, позволяя ему правильно сравнивать даты с операндами.

Так что, если вы хотите пропустить все остальные вещи, вы можете просто взять следующее:

SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%A IN (*.*) DO (
 SET var=%%~tA
 SET var2=!var:~0,-9!
 FOR /F "USEBACKQ tokens=1-3 delims=/" %%F IN (`ECHO !var2!`) DO (
  IF %%H%%F%%G %BorA% %_date% MOVE /Y "%%A" "%_path%\~nxA"
 )
)

И внесите в него некоторые изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...