PDA

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


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

Iska
02-10-2016, 21:15
чтобы раскидывать эти файлы по структуре папок вида 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». Путь к исходной папке указывается аргументом скрипта (также можно просто перетащить папку на скрипт в Проводнике).

mezzin
02-10-2016, 21:30
Внутри того же исходного пути?
Да.

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

Iska
02-10-2016, 21:36
Если это упростит решение задачи можно просто создавать папки вида YYYY_MM_DD и перемещать в них файлы. »
Без разницы. Попробуйте предложенный под спойлером код.

megaloman
02-10-2016, 22:55
@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!\"

mezzin
04-10-2016, 20:02
megaloman, похоже что все файлы копируются в первую созданную папку :(

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

mezzin
06-10-2016, 11:07
Все работает как надо, спасибо megaloman!

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

megaloman
06-10-2016, 16:23
@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

mezzin
06-10-2016, 16:44
megaloman, вы монстр, :yes: Спасибо еще раз!

mezzin
06-10-2016, 20:45
А можно добавить в скрипт проверку чтобы при создании каталога в конце YYYY_MM_DD добавлялось буквенное обозначение дня недели по русски? Это здорово поможет поскольку записи с камер по выходным не так интересны как в рабочие дни.

super_yura_man@vk
25-01-2018, 18:10
а как сделать так чтобы создавались папки вот так 2017.01.25


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

Добрый вечер, а как сделать так чтобы создовалась одна папка типа 2017.01.25
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 »

megaloman
25-01-2018, 18:32
super_yura_man@vk, Было 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!\"Сделайтеrem Set "NDir=%~3\!DNew:~6,4!\!DNew:~3,2!\!DNew:~0,2!\"
Set "NDir=%~3\!DNew:~6,4!.!DNew:~3,2!.!DNew:~0,2!\"

super_yura_man@vk
25-01-2018, 18:38
А так чтобі оно через точку біло а не нижнюю черту

все нашел




© OSzone.net 2001-2012