Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Перемещение файлов в папки по датам создания

Ответить
Настройки темы
CMD/BAT - Перемещение файлов в папки по датам создания

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 17:29, 13-01-2022

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6483
Благодарности: 1462

Профиль | Отправить PM | Цитировать


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"}
}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 13-01-2022 в 18:03.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:56, 13-01-2022 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 14-01-2022 в 17:19.


Отправлено: 14:41, 14-01-2022 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Перемещение файлов в папки по датам создания

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Перемещение файлов в папки, названные по части имен файлов NuclearBox Скриптовые языки администрирования Windows 5 13-02-2021 16:26
CMD/BAT - [решено] Перенос файлов из папки в папку по дате создания valedol_z@vk Скриптовые языки администрирования Windows 11 20-05-2020 09:44
CMD/BAT - Перемещение файлов по маске с созданием папки по дате в названии файла AndreH Скриптовые языки администрирования Windows 5 08-08-2018 09:14
CMD/BAT - [решено] Создание папок исходя из дат создания файлов и перемещение их в эти папки mezzin Скриптовые языки администрирования Windows 13 25-01-2018 18:38
CMD/BAT - Сортирование файлов по папкам (копирование в многоуровневые папки по дате создания) Systems Скриптовые языки администрирования Windows 18 03-10-2014 11:37




 
Переход