Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Перемещение файлов в папки по датам создания (http://forum.oszone.net/showthread.php?t=350479)

NaMoRZA 13-01-2022 17:29 2977529

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

Задача:
Есть папка с входящей почтой, куда ежедневно валятся файлы разных форматов - "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 2977532

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 2977614

CMD
В предположении, что в системе дата отображается в формате ДД.ММ.ГГГГ
Код:

@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 раз на дню.
В батниках уточните путь.


Время: 07:51.

Время: 07:51.
© OSzone.net 2001-