Компьютерный форум 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=319368)

mezzin 02-10-2016 20:17 2674352

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

Iska 02-10-2016 21:15 2674368

Цитата:

Цитата 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». Путь к исходной папке указывается аргументом скрипта (также можно просто перетащить папку на скрипт в Проводнике).

mezzin 02-10-2016 21:30 2674370

Цитата:

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

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

Iska 02-10-2016 21:36 2674372

Цитата:

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

Без разницы. Попробуйте предложенный под спойлером код.

megaloman 02-10-2016 22:55 2674393

Вот батник, сохраните его в файл с расширением .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!\"

mezzin 04-10-2016 20:02 2675058

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

megaloman 04-10-2016 21:56 2675113

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

mezzin 06-10-2016 11:07 2675512

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

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

megaloman 06-10-2016 16:23 2675628

Напишите строки с Вашими папками 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


mezzin 06-10-2016 16:44 2675636

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

mezzin 06-10-2016 20:45 2675686

А можно добавить в скрипт проверку чтобы при создании каталога в конце YYYY_MM_DD добавлялось буквенное обозначение дня недели по русски? Это здорово поможет поскольку записи с камер по выходным не так интересны как в рабочие дни.

super_yura_man@vk 25-01-2018 18:10 2793766

а как сделать так чтобы создавались папки вот так 2017.01.25


Цитата:

Цитата megaloman
@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 2793770

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 2793772

А так чтобі оно через точку біло а не нижнюю черту

все нашел


Время: 07:21.

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