Войти

Показать полную графическую версию : Перемещение файлов в папки по датам создания


NaMoRZA
13-01-2022, 17:29
Здравствуйте!
Перечитал несколько десятков тем здесь и на других форумах, но так и не смог разобраться для решения моей задачи.
Помогите, пожалуйста.

Задача:
Есть папка с входящей почтой, куда ежедневно валятся файлы разных форматов - "C:\Корреспонденция\Входящие\"
Нужно, чтобы ежемесячно запускался батник (это в планировщике сделается на 01 число каждого месяца в 01:00 ночи), который:
1. Проверит даты создания всех файлов в папке "C:\Корреспонденция\Входящие\" и :
2. Создаст папку с номерами годов из дат создания файлов, если таких нет в "C:\Архив\" (например, "C:\Архив\2022")
3. Создаст папки с номерами месяцев, если таких нет в "C:\Архив\%ГОД%\" (например, "C:\Архив\2022\01")
4. Перенесет все файлы из "C:\Корреспонденция\Входящие\" в нужные папки в "C:\Архив\%ГОД%\%МЕСЯЦ%\"
5. Доп.плюшка - запись всех действий в файл-лог.

В результате, папка "C:\Корреспонденция\Входящие\" должна быть пустой по окончанию работы батника.
По идее, разные года будут только при первом запуске и при смене года.
Заранее благодарен.

DJ Mogarych
13-01-2022, 17:56
Powershell:

$sourceFolder = "C:\Корреспонденция\Входящие"
$destinationFolder = "C:\Архив"
$log = "$destinationFolder\log.txt"

dir "$sourceFolder" -File |% {
$fileFolder = "$destinationFolder\$($_.LastWriteTime.ToString("yyyy\\MM"))"
if (!(test-path "$fileFolder")) {mkdir "$fileFolder"; "INFO`t$((get-date).tostring())`tСоздана папка `"$fileFolder`"" >> "$log"}
mv "$($_.FullName)" "$fileFolder"
if ($?) {"INFO`t$((get-date).tostring())`tФайл `"$($_.FullName)`" перемещён в папку `"$fileFolder`"" >> "$log"}
else {"ERROR`t$((get-date).tostring())`tФайл `"$($_.FullName)`" не удалось переместить в папку `"$fileFolder`"" >> "$log"}
}

megaloman
14-01-2022, 14:41
В предположении, что в системе дата отображается в формате ДД.ММ.ГГГГ@Echo Off
cls
>nul Chcp 1251

Set "BoxIn=Z:\Корреспонденция\Входящие"
Set "Mask=*.*"
Set "BoxOut=Z:\Архив"
Set "LogFile=Z:\Архив\%Date:~6,4%%Date:~3,2%%Date:~0,2%.log"

>>"%LogFile%" (Echo.&Echo ===== %Date% %Time% =====&Echo.)

Pushd "%BoxIn%"
FOR /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D /O:-D /T:W "%BoxIn%\%Mask%"`) DO (
Set "DDMMYYYYhhmm=%%~tf"
Call Set "MM=%%DDMMYYYYhhmm:~3,2%%"
Call Set "YYYY=%%DDMMYYYYhhmm:~6,4%%"
>nul 2>&1 Call MD "%BoxOut%\%%YYYY%%\%%MM%%"
>nul Call Move /Y "%BoxIn%\%%f" "%BoxOut%\%%YYYY%%\%%MM%%\" &&>>"%LogFile%" Call Echo "%BoxOut%\%%YYYY%%\%%MM%%\" "%BoxIn%\%%f"
)
Popd
rem pause
Exit /B
@Echo Off
cls
>nul Chcp 1251

Set "BoxIn=Z:\Корреспонденция\Входящие"
Set "Mask=*.*"
Set "BoxOut=Z:\Архив"
Set "LogFile=Z:\Архив\%Date:~6,4%%Date:~3,2%%Date:~0,2%.log"
Set Arc="C:\Program Files\WinRAR\WinRar.exe" a -df -ep1 -ibck -logafp="%LogFile%" -y

>>"%LogFile%" (Echo.&Echo ===== %Date% %Time% =====)

FOR /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D /O:-D /T:W "%BoxIn%\%Mask%"`) DO (
If Exist "%BoxIn%\%%f" (
Set "DDMMYYYYhhmm=%%~tf"
Call Set "MM=%%DDMMYYYYhhmm:~3,2%%"
Call Set "YYYY=%%DDMMYYYYhhmm:~6,4%%"
>nul 2>&1 Call MD "%BoxOut%\%%YYYY%%"
>>"%LogFile%" (Echo.&Call Echo +++++ "%BoxOut%\%%YYYY%%\%%YYYY%%%%MM%%" +++++&Echo.)

Call %Arc% -ta%%YYYY%%%%MM%% "%BoxOut%\%%YYYY%%\%%YYYY%%%%MM%%" "%BoxIn%\%Mask%"
)
)
pause
Exit /B
Оба батника в предположении, что в системе дата отображается в формате ДД.ММ.ГГГГ
Батники можно запускать хоть по 10 раз на дню.
В батниках уточните путь.




© OSzone.net 2001-2012