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

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

Ответить
Настройки темы
CMD/BAT - [решено] Создание папок исходя из дат создания файлов и перемещение их в эти папки

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


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

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


Есть папка в которую камера скидывает видео. За два месяца там накопилось больше 10 тысяч файлов и windows уже не может их все показать.
Прошу помочь создать батник чтобы раскидывать эти файлы по структуре папок вида YYYY\MM\DD

Отправлено: 20:17, 02-10-2016

 

Ветеран


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

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


Цитата mezzin:
чтобы раскидывать эти файлы по структуре папок вида YYYY\MM\DD »
Внутри того же исходного пути?

Попробуйте так (на WSH):
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strSourceFolder

Dim objFile
Dim strDestPath


If WScript.Arguments.Count = 1 Then
	strSourceFolder = WScript.Arguments.Item(0)
	
	With WScript.CreateObject("Scripting.FileSystemObject")
		If .FolderExists(strSourceFolder) Then
			For Each objFile In .GetFolder(strSourceFolder).Files
				strDestPath = strSourceFolder & "\" & _
					CStr(Year(objFile.DateCreated)) & "\" & _
					Right("00" & CStr(Month(objFile.DateCreated)), 2) & "\" & _
					Right("00" & CStr(Day(objFile.DateCreated))  , 2)
				CreateFolderEx strDestPath
				
				objFile.Move strDestPath & "\"
			Next
		Else
			WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
			WScript.Quit 2
		End If
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
	WScript.Quit 1
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub CreateFolderEx(strPath)
	With WScript.CreateObject("Scripting.FileSystemObject")
		If Not .FolderExists(strPath) Then
			CreateFolderEx .GetParentFolderName(strPath)
			.CreateFolder strPath
		End If
	End With
End Sub
'=============================================================================

Сохраните код в файл с расширением «.vbs». Путь к исходной папке указывается аргументом скрипта (также можно просто перетащить папку на скрипт в Проводнике).
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:15, 02-10-2016 | #2



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

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


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


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

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


Цитата:
Внутри того же исходного пути?
Да.

Если это упростит решение задачи можно просто создавать папки вида YYYY_MM_DD и перемещать в них файлы.

Отправлено: 21:30, 02-10-2016 | #3


Ветеран


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

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


Цитата mezzin:
Если это упростит решение задачи можно просто создавать папки вида YYYY_MM_DD и перемещать в них файлы. »
Без разницы. Попробуйте предложенный под спойлером код.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:36, 02-10-2016 | #4


Ветеран


Contributor


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

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


Вот батник, сохраните его в файл с расширением .bat. Можно в той же папке, где и файлы, но лучше в другой.
Код: Выделить весь код
@Echo Off

Set "Where=Z:\Old"
Set "Mask=*.*"
Set "Out=Z:\Old"

Set "Dir=Dir /A:-D /O:D /T:C"

Pushd "%Where%"

SetLocal EnableExtensions EnableDelayedExpansion

Set "DOld="
FOR /F "usebackq tokens=1,3,*" %%i IN (`%Dir% "%Where%\%Mask%" 2^>nul`) DO (
	Set "DNew=%%i"
	Set "DNew=!DNew:~2,1!!DNew:~5,1!"
	If  "!DNew!"==".." If /I Not "%%k"=="%0" (
		Set "DNew=%%i"
		If /I Not "!DOld!"=="%%i" (
			Set "NDir=%Out%\!DNew:~6,4!\!DNew:~3,2!\!DNew:~0,2!\"
			MD "!NDir!"
			Set "DOld=%%i"
		)
		move "%%k" "!NDir!" >nul
	)
)
popd
Пропишите свою исходую папку и папку, где будут создаваться подпапки по датам. Они могут совпадать. У меня Z:\Old
Подразумевается, что в системе дата отображается в формате дд.мм.гггг
Если надо иметь папки в формате YYYY_MM_DD, то вместо имеющейся строки примените:
Set "NDir=%Out%\!DNew:~6,4!_!DNew:~3,2!_!DNew:~0,2!\"

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


Последний раз редактировалось megaloman, 02-10-2016 в 23:09.

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

Отправлено: 22:55, 02-10-2016 | #5


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


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

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


megaloman, похоже что все файлы копируются в первую созданную папку

Отправлено: 20:02, 04-10-2016 | #6


Ветеран


Contributor


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

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


mezzin, Я это проходил. Подозреваю, Вы для проверки скопировали файлы в другую папку. При этом, дата создания будет сегодняшняя, а Вот дата изменения будет реальная прошедшая. Попробуйте работать не с датой создания, а с датой изменения. ИМХО, не думаю, что Вы корректировали ваши видеофайлы, поэтому дата создания в исходной папке = дате изменения. Подкорректируйте батник:
Set "Dir=Dir /A:-D /O:D /T:W"

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

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

Отправлено: 21:56, 04-10-2016 | #7


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


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

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


Все работает как надо, спасибо megaloman!

Теперь сделаю несколько батников с разными переменными для каждой из папок куда камеры скидывают видео и буду их раз в сутки запускать по очереди из общего батника. Так ведь будет работать?

Отправлено: 11:07, 06-10-2016 | #8


Ветеран


Contributor


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

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


Напишите строки с Вашими папками Call :Moving "Откуда" "Маска" "Куда" столько раз, сколько нужно, и не надо куча батников
Код: Выделить весь код
@Echo Off

SetLocal EnableExtensions EnableDelayedExpansion
Set "Dir=Dir /A:-D /O:D /T:W"
rem Set "Dir=Dir /A:-D /O:D /T:C"

Call :Moving "Z:\Old" "*.*" "Z:\Old"
Call :Moving "Z:\Откуда" "*.*" "Z:\Куда"
Call :Moving "Z:\Tralala" "*.*" "Z:\Kuku"


GoTo :Eof

:Moving
rem %1-откуда, %2-маска, %3-куда

Pushd %1

Set "DOld="
FOR /F "usebackq tokens=1,3,*" %%i IN (`%Dir% "%~1\%~2" 2^>nul`) DO (
	Set "DNew=%%i"
	Set "DNew=!DNew:~2,1!!DNew:~5,1!"
	If  "!DNew!"==".." If /I Not "%%k"=="%0" (
		Set "DNew=%%i"
		If /I Not "!DOld!"=="%%i" (
			Set "NDir=%~3\!DNew:~6,4!\!DNew:~3,2!\!DNew:~0,2!\"
rem			Set "NDir=%~3\!DNew:~6,4!_!DNew:~3,2!_!DNew:~0,2!\"
			MD "!NDir!" 2>nul
			Set "DOld=%%i"
		)
		move "%%k" "!NDir!" 1>nul 
	)
)
popd

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

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

Отправлено: 16:23, 06-10-2016 | #9


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


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

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


megaloman, вы монстр, Спасибо еще раз!

Отправлено: 16:44, 06-10-2016 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Перемещение файлов из нескольких папок в одну. BatizhevNH Скриптовые языки администрирования Windows 4 14-05-2012 19:32
CMD/BAT - [решено] Создание папок по дате получения файлов и перемещение в них файлов KamikadZZe Скриптовые языки администрирования Windows 1 01-09-2011 14:15
VBS/WSH/JS - Перемещение файлов и папок в разные папки... WalkManX Скриптовые языки администрирования Windows 0 07-08-2011 22:37
CMD/BAT - Перемещение нескольких папок из папки E2E2~1 ameds Скриптовые языки администрирования Windows 12 23-06-2010 17:27
VBS/WSH/JS - Создание папок исходя из имени хоста.Создание ярлыков. ufunf Скриптовые языки администрирования Windows 1 18-02-2010 13:59




 
Переход